简单的红黑树,一句话概括“保证黑节点平衡”

红黑树 

           

        1、先看下红黑树的定义

              1、每个节点是红色或者是黑色的

              2、根节点是黑色的

              3、每个叶节点是黑色的

              4、如果一个节点是红色的,那他的两个儿子都是黑色的

              5、每个节点下的路径上都有相同数目的黑节点

              6、创建新的节点是红色的

              7、比原节点大的或者等于的在右边,比原节点小的在左边

        2、根据定义,发现规则如下:

                 1、如果父节点是黑色的,不进行调整

                 2、如果父节点是红色的:

                        1、叔叔为空的或者黑色,祖父级旋转到左边,变为红色,父级变为黑色

扫描二维码关注公众号,回复: 12719518 查看本文章

                        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步之后,也就包含了红黑树中所有的情况

             

猜你喜欢

转载自blog.csdn.net/qq_38384460/article/details/112859084