当前位置: 首页 > 知识库问答 >
问题:

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

越健
2023-03-14

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

根高度=1最大值(self.getHeight(root.left),self。getHeight(根(右))

上面给出了一行。

这是我的问题,为什么我们要取左子树和右子树的最大值,并在其中添加一个?如果我们将节点添加到具有最小高度的子树中呢?在这种情况下,两者将具有相同的高度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。通用域名格式。还为极客验证了极客。

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 

共有1个答案

江超英
2023-03-14

假设你有一棵这样的树:

       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(节点(3))仍然等于1。

如果在算法中执行建议的替换,则在所述插入之后,树将错误地获得2的高度:1h(节点(3)),而不是保持高度等于3。

如果你的代码实际上已经被任何编程网站“验证”,那么就逃离那个网站,永远不要再信任他们。

 类似资料:
  • 本文向大家介绍在Javascript AVL树中插入节点,包括了在Javascript AVL树中插入节点的使用技巧和注意事项,需要的朋友参考一下 我们可以学习如何在AVL树中插入节点。AVL树中的插入与BST相同,只要我们在树上向下移动,我们只需在插入过程中执行一个额外的步骤,称为平衡树。 这需要计算我们之前已经看到的平衡因子。并且根据配置,我们需要调用适当的旋转方法。在以上说明的帮助下,这些都

  • 我最近在C。。然后我尝试创建一个AVL。。这样做的第一步。就是在每个节点中添加一个额外的组件bf(平衡因子)。。我是这样做的。 每次malloc在插入时为新节点分配地址。。。我将其信息部分分配给用户输入的值。。将左右指针设置为NULL。除此之外,它还将新节点的bf分配给0。。在插入第一个节点(即根节点)后,程序下次在malloc部分甚至无法为新节点分配内存。。。只要我去掉写着newnode的部分-

  • AVL树是一种平衡的二元搜索树,即高度=O(log(n))。这是通过确保每个节点都遵循AVL树属性来实现的: 左侧子树(LST)的高度-右侧子树(RST)的高度在[-1,0,1]范围内 其中,对于给定节点,高度(LST)-高度(RST)称为平衡因子(BF)。 根据这个定义,叶子的高度是0。但是几乎每次讨论AVL树时,人们都认为叶子的高度是1。 我的问题是,我们能把叶子的高度取为0吗?这将使以下BS

  • 我有一个二进制搜索树插入方法,可以工作。我正在尝试添加一个Trinode方法,如果高度不平衡,可以平衡它。在我的插入方法中,在插入项之后,在插入方法的末尾,我有一个if语句来检查它是否高度平衡。如果是,则打印“高度平衡”。否则,它会打印出“notheight balanced”,然后对我刚刚插入的项目调用triNodeRestructure方法。当我运行代码时,它在调用triNodeRestruc

  • 本文向大家介绍在Javascript AVL树中计算平衡因子,包括了在Javascript AVL树中计算平衡因子的使用技巧和注意事项,需要的朋友参考一下 AVL树检查左子树和右子树的高度,并确保差异不超过1。该差异称为“平衡因子”。 例如,在以下树中,第一棵树是平衡的,接下来的两棵树是不平衡的- 在第二棵树中,C的左子树的高度为2,而右边子树的高度为0,所以差为2。在第三棵树中,A的右子树的高度

  • 主要内容:src/runoob/binary/BinarySearchTreeInsert.java 文件代码:首先定义一个二分搜索树,Java 代码表示如下: public class BST < Key extends Comparable <Key >, Value > {     // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现     private class Node {         private Key key ;         private Val