前序
爱研究源码的你可能会发现JDK8中大量的使用红黑树结构,比如:TreeMap,TreeSet(内部使用TreeMap),HashMap与ConcurrentHashMap(在相同hash值槽位table中节点个数>8,会将之前的链表装换为红黑树),以及继承HashMap的众多子类(如LinkedHashMap),无论是提高自身代码能力还是去应付面试,我们都需好好理解一下红黑树,下面让我们开始吧。
- 定义
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般>要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
-
插入展示
2.1 红色父类xp插入节点x的需调整的步骤(xp的父亲为xpp)
x为根节点或者x为红色,重置为黑色, 完成.
当xp的兄弟节点存在且为红色,xp和xp的兄弟节点重置为黑色,xpp重置为红色将xpp做为x继续调整(如插入4)
当xp的兄弟节点不存在(如插入7或插入3)插入7的情况需先变为插入3的情况
-
删除展示
3.1 待删除节点的后继为黑色的删除步骤 待删除节点为x,xp为父类,xpp为爷爷
x为根节点或者x为红色,重置为黑色, 完成.
x的兄弟为红,可以借用旋转xp
x的兄弟节点为黑且其有红色子节点,可以通多旋转进行借用,注意只有一个子红色节点需要进行类似于插入7到插入3的旋转
x的兄弟节点为黑且没有红色子节点,则x的兄弟节点重置颜色为红,将xp作为x继续进行判断
- 查询
按照二叉排序(搜索)树进行查找
附:文中红黑树的画图我通过www.processon.com在线作图生成,链接如下
https://www.processon.com/view/link/5bff3bf6e4b0ef094cc1aadb
https://www.processon.com/view/link/5bff9e78e4b006dc83a9b052
https://www.processon.com/view/link/5bffa611e4b018141e86c995