红黑树

我们在前面的2票博文中已经写到简单介绍了搜索二叉树搜索二叉树,AVL树AVL树的创建,我们能该看到的是AVL树是一个搜索二叉树,其实,我们现在说的红黑树也是基于搜索二叉树和AVL树中的一些操作上来实现的,如果你对搜索二叉树有疑问,可以看看上面的两篇博文,如果,有错误,还望不吝赐教,如果你对搜索二叉树与AVL树不熟悉,红黑树理解起来就很难了(对我而言),总之,我觉得在看红黑树之前,搜索二叉树,AVL树是需要掌握的;

本篇博文中出现的代码都是模块需要出现的段代码,完整代码以上传GitHub:红黑树的创建;

下面我们就开始红黑树的实现:

红黑树的概念

上面我们已经说过,红黑树是基于搜索二叉树与AVL树实现的,所以它本身是一颗搜索二叉树,它在每个结点上面增加了一个存储位来表示结点的瑶瑟,可以是RED或BLACK,通过对任何一条从根结点到叶子结点上的简单路径来约束,红诶书保证最长路径不超过最短路径的两倍,因而近似平衡。

红黑树的性质(很重要,很重要,很重要)

1、每个节点不是红色就是黑色;
2、根结点为黑色;
3、如果根结点为红,则它的两个叶子结点一定是黑色的(没有连续两个红色结点,可以有连续两个黑色结点哦)
4、对于每个结点,从该节点到其所在后代叶子结点的简单路径上,均包含相同数目的黑色结点(每条路径上黑色结点的数量相同)
5、每个叶子结点都是黑色的(此处的叶子结点是指NULL结点)

在概念中我们提到通过红黑颜色的约束,红黑树能保证最长路径不超过最短路径的两倍,为什么?
由性质3我们可以知道任何一个简单路径上不能有两个连续的红色结点,所以最短路径可能会是全黑结点最长路径是红黑交替,又由4可知,每条路径上黑色结点的数量相同,所以最长路径最大就是最短路径的2倍,所以说不会超过。

插入结点##(只实现了他在左边的情况,镜像实现在完整版代码中有)

根据上述的5个性质,我们大致应该把新插入的结点默认的设置为红色的;
情况1:插入的结点为根结点:

这种情况,其实很简单,我们只需要把它的颜色换为黑色就可以了;
情况2:在黑色结点下插入一个新结点:

其实这种情况也很简单,直接插入下去就可以了,并没有影响红黑树;

情况3:插入结点的双亲和叔叔结点都为红色,祖父结点为黑色;
这里写图片描述

我们需要将双亲和叔叔结点改为黑色,把祖父结点改为红色,然后在往上调整就可以了;

Node* Uncle = Grandfather->_pRight;
                if (Uncle && RED == Uncle->_color)//情况3
                {
                    parent->_color = Uncle->_color = BLACK;
                    Grandfather->_color = RED;

                    NewNode = Grandfather;
                    parent = Grandfather->_pParent;
                }

情况4:插入结点的双亲为红色,插入结点为双亲的左孩子,祖父结点为黑色,叔叔结点不存在/存在为黑色;
这里写图片描述

我们要以祖父结点为parent进行右单旋,这里的单旋就不在介绍了,前面的AVL树中已经说到过了,如有不懂可以看看:
然后把祖父结点的颜色和双亲结点的颜色互换;

_RotateR(Grandfather);  //情况4
                    std::swap(parent->_color, Grandfather->_color);

情况5:插入结点的双亲为红色,插入结点为双亲的右孩子,祖父结点为黑色,叔叔结点不存在/存在为黑色;

这里写图片描述

这种情况,要先以双亲为根进行左单旋,然后就是情况4了,再安装情况4执行就可以了;

                    if (NewNode == parent->_pRight)  //情况5,因为情况5处理完还要处理情况4 ,所以先处理5中的旋转;
                    {
                        _RotateL(parent);
                        std::swap(parent, NewNode);
                    }
                    _RotateR(Grandfather);  //情况4
                    std::swap(parent->_color, Grandfather->_color);
                }
发布了63 篇原创文章 · 获赞 50 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章