假设有图1所示的红黑树,红旗代表红点,灰旗代表黑点
图 1
现在向图中添加数据 8 。根据二叉排序树的性质,8应当被添加为9的左孩子,因为9是红色节点,则8应当为黑色节点,如图2所示。添加黑色节点8,必然导致访问8的子节点时,多经历一个黑色节点,不符合红黑树的基本要求,因此,需要调整。
图 2
要想将新树调整为红黑树,应该将8向上调整,同时找出可以用于弥补8的上升而下降的叶子节点。符合深度要求的叶子节点在图3中被都红笔圈出。
图 3
可以看到,7的左孩子和8节点都在7的子树中,因此优先考虑7的左孩子。因为8是9的左孩子,但是9是7的右孩子,所以直接将7左旋转并不能提升8。直接将7左旋转的效果如图4所示。
图 4
如果使深度超标的节点在9节点的右子树中,则可以通过将7左旋转达到深度调整的目的。因此,我们分两步对图3所示的树做出深度调整。
1. 将9结点进行右旋转,如图5所示
2. 将7结点进行左旋转,如图6所示
图 5
图 6
至此,图6中的树已经达到了平衡树的要求,接下来我们调整树的颜色,得到图7。红黑树的插入工作到此结束。
图 7
同理,如果以2的右孩子,4的左孩子,11的孩子为目标进行操作,也能得到对应的结果。
以11的孩子为目标:
以2的右孩子为目标:
虽然是以2的右孩子为目标,但是调整完成之后没有达到红黑树的条件,因此实际上是同时用到了2和4的子树。