如何优化二叉搜索树删除函数中重复的if-else代码块?
简化方案
你可以利用JS对象的方括号属性访问语法,结合三元运算直接实现逻辑复用,完全消除重复的if-else块。
核心优化逻辑
原来的重复逻辑本质是两步:
- 确定要给
parent的left还是right属性赋值 - 确定要赋的替换值是什么
替换值可合并计算
你分开处理「无子节点」和「有一个子节点」的逻辑是多余的,两种情况的替换值可以用一行逻辑统一计算: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
相关产品推荐
相关产品推荐

