BST
这里的删除操作
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) {
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);
}
在左右儿子都存在时,找到右儿子的最小值,用它替换要删除的节点。但这里是不是没有将被删节点的儿子继承到新节点上?他的写法应该会使删除后的节点儿子丢失吧emmm
蒟蒻一枚,理解不对的话还请dalao指正