我在课堂上获得了一张红黑树的代码。用于创建节点的结构没有父指针。我的大部分项目都在工作,但我无法弄清楚如何在O(lg n)时间内计算排名。按排名,我的意思是如果你要进行inorder-traversal并将键保存到从索引1开始的数组,那么给定键的存储索引。这样做会在O(n)时间内,但不允许这样做。
通过CLRS阅读,扩充数据结构一章有代码返回给定密钥的等级。这正是我需要的,但问题是代码使用父指针。由于我们从未在任何红黑树示例中使用父指针,并且此代码不包含父指针,因此我不相信我们要更改整个给定代码只是为了使排名起作用,这导致我相信有一种方法可以在不使用父指针的情况下完成它。
节点结构中存在的(字段?)是:键(int),指向左子节点的指针,指向右子节点的指针,子树大小(int)和颜色(int)。
所有代码都是用C语言完成的。我想要的是这是否可行,以及如何在有或没有源代码的情况下实现这一点(一个好的解释是完美的)。
答案 0 :(得分:1)
假设:子树大小包括子树的根节点。在a。中调用要订购的值。
然后,这个算法得到O(lgn)中的等级:
1: let rank=subtree size(root of tree)
2: if you go left:
- adjust rank=rank - (subtree size(sts) of right child (rc) of root) - 1
- move to left child(lc) of root
3: if you go right:
- adjust rank=rank(prior)
- move to rc(root)
4: iterate 2-3 (replacing root with current node) until you are at the node with value a
5: if this node has a rc, adjust a final time
- rank = rank - (sts(rc))
完成。
注意:假设rb树通常从左到右从低到高排序。