You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化二叉搜索树删除函数中重复的if-else代码块?

简化方案

你可以利用JS对象的方括号属性访问语法,结合三元运算直接实现逻辑复用,完全消除重复的if-else块。

核心优化逻辑

原来的重复逻辑本质是两步:

  1. 确定要给parent的left还是right属性赋值
  2. 确定要赋的替换值是什么

替换值可合并计算

你分开处理「无子节点」和「有一个子节点」的逻辑是多余的,两种情况的替换值可以用一行逻辑统一计算:
const replacement = current.left || current.right || null;

  • 当current有左子节点时,取左子节点
  • 当current只有右子节点时,取右子节点
  • 当current没有子节点时,最终取值为null

属性名可动态计算

用三元运算判断当前节点是父节点的左子还是右子,直接得到要赋值的属性名:
const prop = parent.left === current ? 'left' : 'right';

合并成一行(可选)

如果不需要兼容根节点删除的边界情况,你甚至可以直接写成一行:
parent[parent.left === current ? 'left' : 'right'] = current.left || current.right || null;

边界情况兼容

注意你当前的代码没有处理**删除的节点是根节点(此时parent为null)**的情况,优化后的完整处理逻辑如下:

// 替换原代码中从「if (!current.left && !current.right)」开始的所有逻辑
const replacement = current.left || current.right || null;
if (!parent) {
  // 处理删除根节点的场景
  root = replacement;
} else {
  parent[parent.left === current ? 'left' : 'right'] = replacement;
}

优化后的完整deleteNode函数

const deleteNode = (root, value) => {
  let current = root;
  let parent = null;
  while (current) {
    if (value === current.value) break;
    parent = current;
    current = value < current.value ? current.left : current.right;
  }

  // 处理有两个子节点的场景
  if (current.left && current.right) {
    const [successor, successorParent] = getInOrderSuccessor(root, current);
    current.value = successor.value;
    current = successor;
    parent = successorParent;
  }

  // 原逻辑全部替换为下面这段
  const replacement = current.left || current.right || null;
  if (!parent) {
    root = replacement;
  } else {
    parent[parent.left === current ? 'left' : 'right'] = replacement;
  }
  
  return root;
};

内容的提问来源于stack exchange,提问作者Espresso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:45:06