返回二叉树中具有等级k的元素

时间:2018-06-15 14:22:49

标签: search binary-tree rank

我已经在伪代码中实现了一个方法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是树的高度。我正在努力解决这个问题,我希望你能给我一个答案。

2 个答案:

答案 0 :(得分:1)

对你的树做出假设:

  • node.size是子节点数加上这些子节点的大小。叶节点的大小为0。
  • 树中最左边的叶元素具有等级0
  • 按照您定义上述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对应的根。

你可以递归编程。