> 文章列表 > 红黑树的插入调整情况分析

红黑树的插入调整情况分析

红黑树的插入调整情况分析

红黑树满足的性质:

  1. 所有结点不是红的就是黑的
  2. 根结点是黑色
  3. 不能有连续的红色结点
  4. 每一条从根到叶子结点(空结点)的路径上,黑色结点数量相同
  5. 所有的叶子结点(空结点)都是黑色的

插入后需要调整情况

构建红色结点进行插入,如果插入位置的父亲结点是红色的就需要进行调整,因为不能有连续的红色结点。

情况一:叔叔存在,且为红

红黑树的插入调整情况分析
红黑树的插入调整情况分析
解决思路:
由于不能有连续的红色结点,所以考虑把父亲parent变为黑色。但是原来parent和uncle为根的子树中,所有路径的黑色结点数量是一样的。现在parent为根的子树中,所有路径上的黑色结点数量就比uncle子树多了一个,为了维持性质,uncle也需要变成黑色。
红黑树的插入调整情况分析

显然这是不够的,因为上图中有可能只是其他树的部分子树而已
红黑树的插入调整情况分析
原来整个树中从根结点到叶子节结点的所有路径上黑色结点数量是一样的,现在以grandparent为根的子树中,黑色结点多了一个,为了维持性质,就必须把grandparent变成红色。
红黑树的插入调整情况分析
当然,这只是我们的假设,grandparent也有可能就是根结点,为了防止这种事情发生,不管整棵树的根结点再此之前被我们变成了什么颜色, 最后都需要将整棵树的根结点强制变成黑色的。

叔叔存在且为红:将父亲和叔叔变成黑色,祖父变成红色,整棵树的根结点最后强制整成黑色。

情况二:叔叔不存在 或者 叔叔存在且为黑(LL/RR型,例如parent为左子树、cur为左子树)

红黑树的插入调整情况分析
1.如果叔叔不存在,那么cur一定是新插入的结点。第一点,因为叔叔不存在意味着grandparent的左子树中也不存在黑色结点。第二点,若cur不是新插入的,考虑性质不能有连续的红色的结点,那么cur原来必定是黑色的,这就与第一点相悖。故而,cur一定是新插入的结点。
红黑树的插入调整情况分析
2.叔叔存在且为黑,那么cur必定不是新插入的结点。因为每一条路径上的黑色结点数量相同,而叔叔已经是黑色的了,cur就必须有孩子,而且cur的孩子中每一条路径都至少有一个黑色结点。故而,cur一定不是新插入的结点,而是调整时被改成红色的。

叔叔不存在 或者叔叔存在且为黑:
1.如果parent是grandparent的左孩子,并且cur是parent的左孩子,进行右单旋。
2.如果parent是grandparent的左孩子,并且cur是parent的右孩子,进行双旋。
· · · 旋转完以后的变色:将祖父和cur变成红色,父亲parent和叔叔uncle变成黑色,整棵树的根结点最后强制整成黑色。

红黑树的插入调整情况分析

情况二:叔叔不存在 或者 叔叔存在且为黑(LR/RL型,例如parent为左子树、cur为右子树)

红黑树的插入调整情况分析
旋转方式与AVL一致,请参考AVL树…
旋转后,就变成了情况二,按照情况二的方式调整即可。