OI wiki里二叉搜索树是不是有点错误emmmm
  • 板块学术版
  • 楼主Kevin_Chance
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/10/20 18:00
  • 上次更新2023/10/27 06:46:20
查看原帖
OI wiki里二叉搜索树是不是有点错误emmmm
547940
Kevin_Chance楼主2022/10/20 18:00

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) {
  // 注意 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);
}

在左右儿子都存在时,找到右儿子的最小值,用它替换要删除的节点。但这里是不是没有将被删节点的儿子继承到新节点上?他的写法应该会使删除后的节点儿子丢失吧emmm

蒟蒻一枚,理解不对的话还请dalao指正

2022/10/20 18:00
加载中...