平衡搜索二叉树的python实现

我的代码片:https://code.csdn.net/snippets_manage

# BST为二叉搜索树的实现文件
import BST

''' 功能:往平衡二叉树中插入一个结点 参数: N:要插入的结点 '''
def BInsert(N):
    # 调用二叉树的插入函数插入元素
    BST.Insert(N)
    # 找出刚插入的元素,更新结点的高度height
    N = BST.Find(N, root)
    Rebalancce(N)

''' 功能:删除AVL树中的一个结点 参数: N:要删除的结点 '''
def BDelete(N):
    # 调用普通二叉搜索树搜索函数删除结点
    p = N.parent
    BSTDelete(N)
    # 重新建立平衡二叉树
    Rebalance(p)

''' 功能:返回x,y之间的所有结点 参数: (x,y):要查找的键值区间 root: 树的根节点 '''
def BRangeSearch(x, y, root):
    # 此操作不会破会平衡二叉树的性质,直接调用普通二叉树的相关函数即可
    T =  BSTRangeSearch(x, y, root)
    return T



''' 功能:调整结点N的高度height 参数:结点N '''
def AdjustHeight(N):
    N.height = 1 + max(N.left.height, N.right.height)
    return
''' 功能:重建平衡树的性质 参数:不满足平衡树性质的结点 '''
def Rebalance(N):
    p = N.parent
    # 如果左子树过重,则右旋
    if N.left.height > N.right.height + 1:
        RebalanceRight(N)
    # 如果右子树过重,则左旋
    if N.right.height > N.left.height + 1:
        RebalanceLeft(N)
    # 调整结点的高度
    AdjustHeight(N)
    if p != None:

        Rebalance(p)

''' 功能:LR型旋转或者LL型旋转 参数: N:破坏点 '''
def RebalanceRight(N):
    M = N.left
    # LR型旋转
    if M.right.height > M.left.height:
        # 左旋
        RotateLeft(M)
    # 右旋
    RotateRight(N)

''' 功能:RL型旋转或者RR型旋转 参数: N:破坏点 '''
def RebalanceLeft(N):
    M = N.right
    # RL型旋转
    if M.left.height > M.right.height:
        # 右旋
        RotateRight(M)

    # 左旋
    RotateLeft(N)


''' 功能:右旋 参数: N:破坏点 '''
def RotateRight(N):
    # N的左孩子结点M替代N
    # N成为M的右孩子结点
    # M的右孩子结点B成为N的左孩子
    p = N.parent
    M = N.left
    B = M.right

    # N的左孩子结点M替代N
    M.parent = p
    if p != None:
        if N == N.parent.left:
            N.parent.left = M
        else:
            N.parent.right = M
    # N成为M的右孩子结点
    M.right = N
    N.parent = M

    # M的右孩子结点B成为N的左孩子结点
    if B != None:
        N.left = B
        B.parent = N
    else:
        N.left = None

    # 调整结点高度(N,M的高度可能发生改变)
    AdjustHeight(N)
    AdjustHeight(M)

''' 功能:左旋 参数: N:破坏点 '''
def RotateLeft(N):
    # N的右孩子结点M替代N
    # N成为M的左孩子结点
    # M的左孩子结点B成为N的右孩子结点
    p = N.parent
    M = N.right
    B = M.left

    # M替代N结点
    M.parent = p
    if p != None:
        if N == p.left:
            p.left = M
        else:
            p.right = M
    # N成为M的左孩子结点
    N.parent = M
    M.left = N
    # B成为N的右孩子结点
    if B != None:
        B.parent = N
        N.left = B
    else:
        N.left = None
    # 更新M,N结点的高度
    AdjustHeight(N)
    AdjustHeight(M)


    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/lym152898/article/details/52021213
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞