描述:确定第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);
}
答案 0 :(得分:2)
对于每个节点,请跟踪其子树中的节点数。当您执行涉及此子树的操作时,请更新此数字。
当您需要在子树中找到第i
个最小元素时,可以查看根节点左子树中的节点数。如果该数字大于或等于i
(假设i
是一个索引的),则所需的节点在左子树中,您可以对其进行递归/迭代。如果数字恰好是i - 1
,则当前节点为所需节点。否则,所需的节点是右子树中的第i - (leftcount + 1)
个节点,您可以适当地递归/迭代。