我已经在伪代码中实现了一个方法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的节点。
我正在努力解决这个问题,我希望你能给我一个答案。
答案 0 :(得分:1)
因此,如果给定等级k并且我们需要找到具有给定等级的节点,我们首先需要遍历算法来搜索树。预订遍历应该可以正常工作。这是一个递归的。
function preOrderTraversal(node){
if(node !== null){
print(node.data);
preOrderTraversal(node.left);
preOrderTraversal(node.right);
}
}
现在我们有办法通过我们的树,我们需要实现elementbyRank
方法并修改遍历算法。我们将检查每个节点的排名,而不是打印数据。我们需要通过我们需要找到的等级,我们需要在遍历中添加一个返回值。
elementbyRank方法非常简单:
function elementbyRank(k){
return preOrderTraversal(root, k);
}
现在我们需要对prePrderTraveral进行更改,让我们将名称更改为elementbyRankTraversal。
function elementbyRankTraversal(node, key){
if(node !== null){
if(key == rankofElement(node.key))
return node;
return elementbyRankTraversal(node.left);
return elementbyRankTraversal(node.right);
}
return null;
}
所以现在如果我们找到一个传入等级的节点,我们将返回该节点。但如果一个不存在,我们将获得一个空值。
我知道你说给定node x
,rankofElement(x)
将返回元素的等级。但您将node's key
直接与x
进行比较,告诉我x
不是node
,x
是key of node x
。如果我错了,那么只需从elementbyRankTraversal()
中删除关键部分即可。
这应该有效。