红黑树
1、先看下红黑树的定义
1、每个节点是红色或者是黑色的
2、根节点是黑色的
3、每个叶节点是黑色的
4、如果一个节点是红色的,那他的两个儿子都是黑色的
5、每个节点下的路径上都有相同数目的黑节点
6、创建新的节点是红色的
7、比原节点大的或者等于的在右边,比原节点小的在左边
2、根据定义,发现规则如下:
1、如果父节点是黑色的,不进行调整
2、如果父节点是红色的:
1、叔叔为空的或者黑色,祖父级旋转到左边,变为红色,父级变为黑色
2、叔叔是红色,父节点+叔叔节点变黑色,祖父节点变为红色,如果祖父节点为根节点,变为黑色
3、红黑树演示链接
https://rbtree.phpisfuture.com/
4、有了上面的规则+定义,我们尝试自己一个一个演算下
1、我们先创建一个10根节点,为了满足根节点是黑色,把刚创建的节点变为黑色
2、再创建一个新节点20,根据规则创建在根节点的右边,发现符合条件,不需要任何操作
3、我们继续往右插入30,此时发现触犯了叔叔为空的情况,那么按照规则2.1.1,我们要先左旋保证叔叔不为空,也就将20变为了根节点,原来的根节点10向左移动一位
4、继续插入40,此时符合了2.2.2原则,将父节点和叔叔节点改为黑色,由于祖父节点为根节点,还是黑色
5、插入50, 符合了2.2.1规则,50的叔叔是空的,也就导致了要旋转,将祖父级30旋转到左边,变为红色,40变为这三个中的中间,变为黑色。
6、插入60,符合2.2.2规则,叔叔为红色,将父节点50和叔叔30变为黑色,祖父节点40变为红色,也就得到了下面这个图
7、插入70,符合2.2.1规则,叔叔为空的,祖父级旋转到左边,变为红色,父级变为黑色
8、这里操作了两步
1、插入80,此时符合2.2.2规则,叔叔为红色的,父节点70+叔叔节点50变黑色,祖父节点60变为红色了
2、此时查询祖父节点60叔叔是黑色,不符合2.2.1规则,叔叔是黑色,也就需要祖父级20旋转到左边,变为红色,父级40变为黑色 ,也就得到了下面比较平衡的树
走了这8步之后,也就包含了红黑树中所有的情况