重新平衡后更新AVL树中的高度

时间:2019-03-20 09:02:17

标签: python avl-tree

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。enter image description here

如果我尝试加3,则会将其附加到2的右子元素上。node.right = Node(3, node, None, None)如果node是2。显然,预期的行为如下。

enter image description here

在我的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 = 2root.right = 3root.left = 1。但是,旋转后,我的身高不正确。孩子的身高是0,我的根是3。

旋转期间应该在哪里/如何更新高度?

0 个答案:

没有答案