[英]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.