如何在Python中为我的二叉树实现OS-Rank()函数?

时间:2011-05-25 08:08:25

标签: python binary-tree

我正在尝试为我构建的二叉树实现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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

令人尴尬的是,我误解了OS-Rank()的目的。我认为它设置了每个节点的大小值,但它似乎实际上是在插入时完成的。 OS-Rank()通过使用该大小值返回节点的等级。

我保证不再凌晨2点编码!

相关问题