Balance-Tree-Altered

This commit is contained in:
e2hang
2025-08-26 21:39:35 +08:00
parent 3eb93c256c
commit 96738dec6c
19 changed files with 187 additions and 0 deletions

View File

@@ -261,3 +261,54 @@
你希望我画吗?
---
没错 ✅,你总结得非常到位。
这是二叉搜索树BST**删除的基本套路**,红黑树只是额外多了颜色和修复步骤而已。
---
### 普通 BST 的删除分类
假设删除的节点是 `z`
1. **没有孩子(叶子)**
→ 直接删。
2. **只有一个孩子**
→ 用孩子替换它。
3. **有两个孩子**
→ 找 **中序后继(右子树最小)** 或 **中序前驱(左子树最大)**
* 把 `y.key` 复制到 `z.key`
* 实际删除 `y`(而 `y` 一定是“最多一个孩子”的情况)。
所以 **情况 3 总是能转化为情况 1 或 2**。
---
### 为什么后继/前驱最多只有一个孩子?
比如用 **后继**(右子树最小的节点)来说明:
* `y` 在 `z.right` 里,且 `y` 是最靠左的。
* 所以 `y` 不可能有左孩子(否则就不是最左的了)。
* 因此 `y` 要么没有孩子,要么只有右孩子。
对称地,用前驱的话,也必然是“没有孩子或只有左孩子”。
---
### 到红黑树这里
红黑树继承了 BST 结构,所以删除逻辑一样:
* 如果 `z` 有两个孩子,**我们实际删的就是它的后继/前驱 `y`**,而不是直接删 `z`。
* 这就是你说的“删除下移”。
真正复杂的地方在于:**如果被删的是黑色节点**,就需要一整套 `fixup` 来维持红黑树的平衡。
---
要不要我帮你把“3 种情况 → 转化为 2 种简单情况”的流程画成一个 **决策图(删除流程图)**?这样会更直观。

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB