在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()