在订单统计树中,节点的排名是多少?
是否由
提供rank = x.left.size + 1
还是通过这个功能?
OS-RANK(T, x)
{
r = left.size + 1
y = x
while (y != T.root)
{
if (y == y.p.right) {
r = r + y.p.left.size + 1
}
}
return r
}
我真的很困惑,因为我觉得它应该只是x.left.size + 1
,因为那应该是x
在树的顺序树行走中的位置。
答案 0 :(得分:6)
订单统计树中的每个节点只存储其左子树中的节点数(以及可选地,在其右子树中)。如果您只是读取此值,则不一定知道节点的等级,因为您不知道节点所在的顺序统计树中的位置。例如,如果您的节点位于根节点的右子树中,则需要将根目录左侧的所有节点计入排名。
如果您有一个节点并想知道它的等级,您可以使用修改后的BST查找来计算它。在伪代码中:
function rank(node root, node n):
/* If n is the root of the tree, its rank is the number of nodes in its
* left subtree.
*/
if root.value == n.value:
return n.leftSize
/* Belongs in right subtree: */
else if root.value < n.value:
return rank(root.left, n)
/* Belongs in left subtree: */
else:
return root.leftSize + 1 + rank(root.right, n)
希望这有帮助!
答案 1 :(得分:0)
代码中的所有内容都是正确的,但在每次迭代后,您必须再添加一个命令来更新指针“y”的值。 y = y。磷;
正确的算法将是
OS-RANK(T, x) {
r = left.size + 1;
y = x ;
while (y != T.root)
{
if (y == y.p.right)
{
r = r + y.p.left.size + 1
}
y = y. p;
}
return r
}