Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 取ith,在O(h)中,h是树的高度_C++_Binary Search Tree - Fatal编程技术网

C++ 取ith,在O(h)中,h是树的高度

C++ 取ith,在O(h)中,h是树的高度,c++,binary-search-tree,C++,Binary Search Tree,描述:确定第i个最小元素。如果我超出范围,则返回false,否则返回true 我尝试过实现不同的版本,这是我工作的唯一方式,但不是O(h) bool get_ith(int i,T&x){ int n=大小(); int-sofar=0; if(in) 返回false; _获取(根,i,x,sofar); 返回true; } 私人: //完成大部分工作的递归助手函数 静态无效(bst节点*t、int i、t&x、int&sofar){ if(t==nullptr) 回来 _获取(t->左,i,x

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

我尝试过实现不同的版本,这是我工作的唯一方式,但不是O(h)

bool get_ith(int i,T&x){
int n=大小();
int-sofar=0;
if(i<1 | | i>n)
返回false;
_获取(根,i,x,sofar);
返回true;
}
私人:
//完成大部分工作的递归助手函数
静态无效(bst节点*t、int i、t&x、int&sofar){
if(t==nullptr)
回来
_获取(t->左,i,x,sofar);
if(sofar==i)
回来
sofar++;
if(sofar==i){
x=t->val;
回来
}
_得到(t->右,i,x,sofar);
}

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


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

我对如何实现您的意思有点困惑,您可以编写伪代码吗?这样我就可以看出你想表达什么。@JCoding你对哪一部分感到困惑?
 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);
    }