class Node:
def __init__(self, value, parent=None, left=None, right=None):
self.value = value
self.parent = parent
self.left = left
self.right = right
self.height = 0
class AVLTree:
def __init__(self):
self.root = None # The root Node of the tree
self.size = 0
def insert(self, node):
.
.
.
if node.parent is not None:
self.rebalance(node)
self.rebalance(node)
我试图递归地实现AVL树,但是当递归展开时,我很难更新高度。例如,考虑节点1和2。
如果我尝试加3,则会将其附加到2的右子元素上。node.right = Node(3, node, None, None)
如果node是2。显然,预期的行为如下。
在我的insert
方法中,在递归找到值为3的节点的正确位置之后,在rebalance
方法中,它从值为2的节点开始,为值为3的节点的父节点展开。它根据左右两个子元素来更新高度;对于节点2,它是node.height = max(node.left.height, node.right.height) + 1
=1。
然后,它计算平衡系数以确定是否需要旋转。对于节点2,由于bal_fac = node.left.height - node.right.height
= -1,因此不需要。
再次展开到节点1,它会更新高度;这次node.height = 2
。计算bal_fac
等于-1 = 1 -2,需要向左旋转。
嵌入在rebalance
中的旋转按预期方式工作-root = 2
,root.right = 3
,root.left = 1
。但是,旋转后,我的身高不正确。孩子的身高是0,我的根是3。
旋转期间应该在哪里/如何更新高度?