参考链接: 什么是红黑树-知乎
1. 红黑树来源
红黑树是基于二叉查找树
二叉查找树(BST)具备什么特性呢?
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。
2. 红黑树的特性
- 1.结点是红色或黑色。
- 2.根结点是黑色。
- 3.每个叶子结点都是黑色的空结点(NIL结点)。
- 4 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
- 5.从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点
下图是一个标准的红黑树
3.红黑树的插入
现在考虑插入时具体情况对红黑树维持规则1~5进行说明
局面1:新结点(B)的父结点是黑色。
方法:不需要进行调整
局面2:新结点(A)位于树根,没有父结点。
方法:A变黑色即可
局面3:新结点(D)的父结点和叔叔结点都是红色。
方法: 3次变色——B先变黑,A再变红,C再变黑
局面4:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,且新结点是父结点的右孩子,父结点(B)是祖父结点的左孩子。
方法:先按B左旋转,得到局面5
局面5:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,且新结点是父结点的左孩子,父结点(B)是祖父结点的左孩子。
方法:先按A进行右旋转,【期间会对B的右儿子进行交换成A的左儿子】,再让B变黑,A变红色:
3.1 插入例子讲解
看上图,我们可以分别考虑插入结点【0,2,9,12,14,16,21,23,26,29】
大致根据局面1~5说明一下情况:
0/2/9/12: 这种情况父节点和叔结点都是红色【局面3】,先变色,会将8变红,1和11变黑,约等于插入一个红色的8,发现父亲结点13是黑色,不用继续调整
14/16: 父亲结点是黑色,不需要调整【局面1】
21/23/26/29:父亲和叔叔结点都是红色,需要先变色,25变红,22和27变黑,等于插入结点25。25的父节点17是红色,且没有叔叔结点,且自己是祖父结点的右儿子的右节点,需要按祖父结点13进行旋转【局面5】,17变成根结点【局面2/5】,17再变成黑色,13变成红色【局面5】。结束【注意15结点会变成13结点的右儿子】