4.44 设我们想要把运算FindKth添加到指令集中去。该运算FindKth( r, i)返回树T的具有第;个最小关键字的元素。假设所有的元素具有互异的关键字。解释如何修平均0(iog N)时间支持这种运算,而又不影响任何其他操作的时间界。
翻译一下这道题,在已经排号的二叉搜索树中找到第K大的元素;
下面上代码;
辅助代码:
static size(SearchTree t) {
if (t) {
return t->size;
}
return 0;
}
功能实现代码:
Position findKth(SearchTree t, int i) {
if (i <= size(t->left)) {
//如果i小于这个树左子树的总尺寸-相当于kth这个元素就在这棵树的左子树中
return findKth(t->left, i);
}
else if (i == size(t->left) + 1)
return t;
//如果i刚好是这棵树的根节点,就直接返回这棵树就可以了
else if (i <= t->size)
return findKth(t->right, i -size(t->left) - 1);
/*
如果i比全树的尺寸小(相当于前两个if不满足,但是他又比整个的小,
即:kth在整个树的右子树中
此时的k不能用i来表示,因为,左子树也占了一部分,
而此时递归已进入右子树,无法考虑左子树,
所以要减去左子树的尺寸和整棵树根节点的尺寸
*/
else
return NULL;
}