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

1 投票
1 回答
1331 浏览
提问于 2025-04-16 18:18

我正在为我构建的二叉树实现一个叫做OS-Rank()的功能。OS-Rank的作用是给树中的每个节点标记一个数字,这个数字表示比这个节点小的节点数量,并把这个数字存储在节点的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表示遍历的方向,括号里的数字是节点的size,也就是排名。

我原本期待的结果是这样的:

L L 1(1) U 2(2) U 5(5) R L 6(1) U 7(2) U U

有什么建议吗?

1 个回答

1

尴尬的是,我之前误解了OS-Rank()的用途。我以为它是用来设置每个节点的大小值,但实际上这个大小值是在插入时设置的。OS-Rank()是通过这个大小值来返回一个节点的排名。

我保证以后不再凌晨两点写代码了!

撰写回答