先上代码:
int deletemin(int& o) {
if (!lc[o]) {//没有左子树了
int u = o;
o = rc[o];
return u;
} else {
int u = deletemin(lc[o]);
siz[o] -= cnt[u];
return u;
}
}
void del(int& o, int v) {
// 注意 o 有可能会被修改
siz[o]--;
if (val[o] == v) {
if (cnt[o] > 1) {
cnt[o]--;
return;
}
if (lc[o] && rc[o]) o = deletemin(rc[o]);
// 这里以找右子树的最小值为
例
else
o = lc[o] + rc[o];
return;
}
if (val[o] > v) del(lc[o], v);
if (val[o] < v) del(rc[o], v);
}
再来个图:

其中5,8,9是编号,当我们删5,这时候9顶替上去,我想请问的是 当返回到 o = deletemin(rc[o]) 这一步的时候,rc[o]的值被修改为8,o的值变成9,但是这里rc[o]里面的o是9还是5?然后lc[9]是如何更改成5的左孩子的 ? 希望朋友们可以给我解答了,看BST看了一天了