Balance-Tree-Altered
This commit is contained in:
@@ -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 种简单情况”的流程画成一个 **决策图(删除流程图)**?这样会更直观。
|
||||
|
Reference in New Issue
Block a user