情况三: 有两个子节点
前驱 后继
补充
补充:BST 删除节点按子树数量分三种情况:
- 情况一:叶子节点 —— 直接删除即可。
- 情况二:仅有一个子节点 —— 用唯一子节点顶替被删节点的位置。
- 情况三:有两个子节点(即原笔记中提到的)—— 在左子树中找前驱(左子树最大值)或在右子树中找后继(右子树最小值),用其值顶替被删节点,然后递归删除那个前驱/后继叶子,从而把问题归约为情况一/二。
function removeNode(root, key) { if (!root) return null; if (key < root.val) root.left = removeNode(root.left, key); else if (key > root.val) root.right = removeNode(root.right, key); else { if (!root.left) return root.right; if (!root.right) return root.left; // 两个子节点:用右子树的最小值(前驱可选)顶替 let min = root.right; while (min.left) min = min.left; root.val = min.val; root.right = removeNode(root.right, min.val); } return root; }
来源整理自:我的有道云笔记



