我正在尝试为我构建的二叉树实现OS-Rank()函数。 OS-Rank从树中标记具有较小节点数的节点,并将其存储在node.size中。这允许OS-Select在O(nlgn)时间内轻松选择第i个最小节点。
这是伪代码:
OS-RANK(x)
r = x.left.size + 1
y = x
while y != T.root
if y == y.parent.right
r = r + y.parent.left.size + 1
y = y.parent
return r
这是我的代码:
def osrank(self, root):
r = 0
if self.left != None:
r = self.left.size + 1
else:
r += 1
y = self
while y != root:
if y == y.parent.right:
if y.parent.left != None:
r = r + y.parent.left.size + 1
else:
r += 1
y = y.parent
self.size = r
没有太大的不同,除了我必须处理节点为空的情况。
然而,当我在插入{5,2,7,1,6}之后打印出我的顺序遍历时,我得到了这个:
L L 1(1)U 2(1)U 5(1)R L 6(3)U 7(3)U U
(L / U / R描述遍历,括号中的数字是node.size或排名)。 我想我期待这样的事情:
L L 1(1)U 2(2)U 5(5)R L 6(1)U 7(2)U U
有什么建议吗?
答案 0 :(得分:1)
令人尴尬的是,我误解了OS-Rank()的目的。我认为它设置了每个节点的大小值,但它似乎实际上是在插入时完成的。 OS-Rank()通过使用该大小值返回节点的等级。
我保证不再凌晨2点编码!