04-树5 Root of AVL Tree(Python)——(3)

在PTA测试中完全通过了。
在编写程序的时候,我犯了一个错误,

#RL_Rotation函数
def RL_Rotation(Tree):
    B = Tree.right
    C = B.left

在旋转函数中,一开始我把B和C都使用自定义的Node类定义了,

#RL_Rotation函数
def RL_Rotation(Tree):
    B = Node(Tree.right)
    C = Node(B.left)

这样会在程序运行时报错。它会把Node文件中的self.root重新当作一个类,这样就无法进行后续的递归,会报错。我在这个问题花费了大量时间,希望大家可以避免这个错误。
完整的代码如下所示:`

class Node:
    def __init__(self,ele):
        self.left = None
        self.right = None
        self.root = ele
        self.height = None

#程序运行主函数
def main():
    N = int(input())
    AllNodes = list(map(int,input().split()))
    Tree = Node(AllNodes[0])
    Tree.height = 1
    for i in range(1, len(AllNodes)):
        Tree = Insert(Tree, AllNodes[i])

    print(Tree.root)

#主函数中用到的Insert函数
def Insert(Tree, node):
    if(Tree is None):
        Tree = Node(node)
        Tree.height = 1
    #大的值放在右边
    elif(node > Tree.root):
        Tree.right = Insert(Tree.right,node)
        #插入新节点口,判断新树是否符合平衡树要求
        if(getHeight(Tree.left) - getHeight(Tree.right) == -2):
            #如果进行右旋
            if(node>Tree.right.root):
                Tree = RR_Rotation(Tree)
            else:
                Tree = RL_Rotation(Tree)
    elif(node < Tree.root):
        Tree.left = Insert(Tree.left,node)
        if(getHeight(Tree.left)- getHeight(Tree.right)==2):
            #如果进行左旋
            if(node<Tree.left.root):
                Tree = LL_Rotation(Tree)
            else:
                Tree = LR_Rotation(Tree)
    return Tree

#getHeight函数
#目的是获取各个子树的高度
def getHeight(Tree):
    if(Tree is None):
        return 0
    else:
        HL = getHeight(Tree.left)
        HR = getHeight(Tree.right)
        H = max(HL,HR)
    return (H+1)

#RR_Rotation 函数
def RR_Rotation(Tree):
    B = Tree.right
    Tree.right = B.left
    B.left = Tree
    Tree.height = max(getHeight(Tree.right),getHeight(Tree.left))+1
    B.height = max(getHeight(B.right),Tree.height)+1

    return B

#LL_Rotation函数
def LL_Rotation(Tree):
    B = Tree.left
    Tree.left = B.right
    B.right = Tree
    Tree.height = max(getHeight(Tree.right), getHeight(Tree.left)) + 1
    B.height = max(getHeight(B.left), Tree.height) + 1

    return B
#RL_Rotation函数
def RL_Rotation(Tree):
    B = Node(Tree.right)
    C = Node(B.left)
    Tree.right = LL_Rotation(B)
    return RR_Rotation(Tree)

#LR_Rotation函数
def LR_Rotation(Tree):
    B = Tree.left
    C = B.right
    Tree.left = RR_Rotation(B)
    return LL_Rotation(Tree)

if __name__=="__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值