我已经在伪代码中实现了一个方法rankOfElement(x)
,它返回给定节点x的排名:
function rankofElement(x) {
rank = 0;
Node temp = root;
while (temp.key != x) {
if (x < temp.key) {
temp = temp.leftson
} else if (x > temp.key) {
rank += temp.leftson.size + 1;
temp = temp.rightson;
} else if (temp.key == x) {
return rank + temp.leftson.size
} else return "key not found"
}
现在我应该在伪代码中实现一个方法(elementbyRank(k)
),它在二叉树的上下文中返回一个具有特定等级k的节点。此外,实现应具有最大O(h)时间,其中h是树的高度。我正在努力解决这个问题,我希望你能给我一个答案。
答案 0 :(得分:1)
对你的树做出假设:
rankOfElement()
的方式,节点的排名等于其左子级的大小加一。size
初始化为0,并且每次将对象插入树中时都会递增 - 因此,它始终是准确的。所以,
function elementbyRank(k) {
Node temp = root;
int tempsize = 0;
while (k != tempsize + temp.leftson.size + 1) {
if (k < temp.leftson.size + 1) {
temp = temp.leftson;
} else if (k > temp.leftson.size) {
tempsize += temp.leftson.size + 1;
temp = temp.rightson;
} else {
return "rank not found";
}
}
return temp;
这实际上是在二叉树上进行二进制搜索,除了使用key
作为标准,它使用size
。搜索到达具有所需等级的节点时终止。
答案 1 :(得分:0)
假设rank(pos
参数)有效,参数r
是根,并且每个子树的节点数存储在名为size
的字段中,这是C ++ / C伪代码中的一个版本:
Node * elementbyRank(Node * r, int pos)
{
while (pos != r->left->size)
{
if (pos < r->right->size)
r = r->left;
else
{
pos = pos - r->left->size + 1;
r = r->right;
}
}
return r;
}
该函数将返回与inorder位置pos
对应的根。
你可以递归编程。