在O(h)中获得ith,其中h是树的高度

时间:2019-04-06 23:48:42

标签: c++ binary-search-tree

描述:确定第i个最小元素。如果我超出范围,则返回false,否则返回true。

我试图实现不同的版本,这是我工作的唯一途径,而不是O(h)。

 bool get_ith(int i, T &x) {
      int n = size();
      int sofar=0;

      if(i < 1 || i > n)
        return false;

      _get_ith(root, i, x, sofar);
      return true;
    }

  private:
    // recursive helper function that does most of the work
    static void _get_ith(bst_node *t, int i, T &x, int &sofar) {
      if(t==nullptr)
        return;
      _get_ith(t->left, i, x, sofar);

      if(sofar==i)
        return;
      sofar++;
      if(sofar==i) {
        x = t->val;
        return;
      }
      _get_ith(t->right, i, x, sofar);
    }

1 个答案:

答案 0 :(得分:2)

对于每个节点,请跟踪其子树中的节点数。当您执行涉及此子树的操作时,请更新此数字。

当您需要在子树中找到第i个最小元素时,可以查看根节点左子树中的节点数。如果该数字大于或等于i(假设i是一个索引的),则所需的节点在左子树中,您可以对其进行递归/迭代。如果数字恰好是i - 1,则当前节点为所需节点。否则,所需的节点是右子树中的第i - (leftcount + 1)个节点,您可以适当地递归/迭代。