C++ 取ith,在O(h)中,h是树的高度
描述:确定第i个最小元素。如果我超出范围,则返回false,否则返回true 我尝试过实现不同的版本,这是我工作的唯一方式,但不是O(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
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);
}