插入节点时计算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。
如果 您的代码 实际上 'verified' 任何编程站点,那么 运行 远离那个网站,永远不要再相信他们。
我已经在三个来源中验证了 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。
如果 您的代码 实际上 'verified' 任何编程站点,那么 运行 远离那个网站,永远不要再相信他们。