You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
3.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
- 性质1每个节点要么是黑色要么是红色。
- 性质2根节点是黑色。
- 性质3每个叶子节点NIL是黑色。
- 性质4每个红色结点的两个子结点一定都是黑色。
- 性质5任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
- 最长子树长度不超过最短子树的2倍
从性质5又可以推出
- 性质5.1:如果一个结点存在黑子结点,那么该结点肯定有两个子结点
- **左旋**:以某个结点作为支点(旋转结点)其右子结点变为旋转结点的父结点右子结点的左子结点变为旋转结点的右子结点左子结点保持不变。如图3。
- **右旋**:以某个结点作为支点(旋转结点)其左子结点变为旋转结点的父结点左子结点的右子结点变为旋转结点的左子结点右子结点保持不变。如图4。
![[2392382-a95db442f1b47f8a.webp]]
![[2392382-0676a8e2a12e2a0b.webp]]
## 查找:
- 从根结点开始查找,把根结点设置为当前结点;
- 若当前结点为空返回null
- 若当前结点不为空用当前结点的key跟查找key作比较
- 若当前结点key等于查找key那么该key就是查找目标返回当前结点
- 若当前结点key大于查找key把当前结点的左子结点设置为当前结点重复步骤2
- 若当前结点key小于查找key把当前结点的右子结点设置为当前结点重复步骤2
![[2392382-07b47eb3722981e6.webp]]
## 插入:
插入操作包括两部分工作:一查找插入的位置;二插入后自平衡。查找插入的父结点很简单,跟查找操作区别不大:
1. 从根结点开始查找;
2. 若根结点为空,那么插入结点作为根结点,结束。
3. 若根结点不为空,那么把根结点作为当前结点;
4. 若当前结点为null返回当前结点的父结点结束。
5. 若当前结点key等于查找key那么该key所在结点就是插入结点更新结点的值结束。
6. 若当前结点key大于查找key把当前结点的左子结点设置为当前结点重复步骤4
7. 若当前结点key小于查找key把当前结点的右子结点设置为当前结点重复步骤4
注:新插入的节点一定是红色
![[2392382-7521866b50683a24.webp]]
![[2392382-fa2b78271263d2c8.webp]]
## 删除:
红黑树的删除操作也包括两部分工作:一查找目标结点;而删除后自平衡。查找目标结点显然可以复用查找操作,当不存在目标结点时,忽略本次操作;当存在目标结点时,删除后就得做自平衡处理了。删除了结点后我们还需要找结点来替代删除结点的位置,不然子树跟父辈结点断开了,除非删除结点刚好没子结点,那么就不需要替代。
二叉树删除结点找替代结点有3种情情景
- 情景1若删除结点无子结点直接删除
- 情景2若删除结点只有一个子结点用子结点替换删除结点
- 情景3若删除结点有两个子结点用后继结点大于删除结点的最小结点替换删除结点
![[2392382-fa2b78271263d2c8 1.webp]]