繁体   English   中英

插入节点时计算 AVL 树的高度

[英]Calculating height for AVL tree while inserting node

我已经在 avl 插入代码的三个来源中进行了验证。 在所有计算高度的情况下,

root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right))

给出了上面的行。

这是我的查询,为什么我们要取左右子树的最大值并添加一个? 如果我们将节点添加到具有最小高度的子树怎么办? 在这种情况下,两者都将具有相同的高度H而不是H+1

这个高度的增量应该添加为,

 elif key < root.key:    
      root.left = self.insertNode(root.left, key)  
      root.height = 1 + self.getHeight(root.left)
 else:    
      root.right = self.insertNode(root.right, key)
      root.height = 1 + self.getHeight(root.right )

我对么? 如果是,为什么这些人在服用 max 后还要加一个?

请使用下面的完整代码进行验证。 代码取自 programiz.com。 还为极客验证了极客。

def insertNode(self, root, key): 

        if not root: 
            return TreeNode(key) 
        elif key < root.key: 
            root.left = self.insertNode(root.left, key) 
        else: 
            root.right = self.insertNode(root.right, key) 

        root.height = 1 + max(self.getHeight(root.left), 
                        self.getHeight(root.right)) 

        balanceFactor = self.getBalance(root) 

        if balanceFactor > 1:
            if key < root.left.key: 
                return self.rightRotate(root) 
            else:
                root.left = self.leftRotate(root.left) 
                return self.rightRotate(root)

        if balanceFactor < -1:
            if key > root.right.key: 
                return self.leftRotate(root)
            else:
                root.right = self.rightRotate(root.right) 
                return self.leftRotate(root)

        return root 

假设你有一棵这样的树:

       5
      / \
     /   \
    3     7
   /     / \
  2     6   8
             \
              9

树的高度为 3(根节点 5 和最深的叶节点 9 之间有 3 个分支)。

左边的子树的高度为 1(以节点 3 为根),右边的为 2(以 7 为根),并且

3 = H(node(5)) = 1 + max(H(node(3)), H(node(7))) = 1 + max(1, 2)

现在假设您向树中添加一个键为 4 的节点:

       5
      / \
     /   \
    3     7
   / \   / \
  2   4 6   8
             \
              9

以节点 3 为根的树的高度没有增加:H(node(3)) 仍然等于 1。

如果您在算法中进行建议的替换,则在描述的插入后,您的树将错误地获得高度 2: 1 + H(node(3)) ,而不是保持高度等于 3。

如果您的代码实际上已被任何编程站点“验证” ,那么请远离该站点并且永远不要再信任它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM