关于二叉查找树中删除操作中的传址调用
  • 板块灌水区
  • 楼主CuSO4_and_5H2O
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/7/4 20:38
  • 上次更新2023/10/27 21:52:47
查看原帖
关于二叉查找树中删除操作中的传址调用
231946
CuSO4_and_5H2O楼主2022/7/4 20:38

先上代码:

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看了一天了

2022/7/4 20:38
加载中...