目录
一、引入
学习红黑树,首先要了解树得一些概念,以及二叉树,二叉搜索树,平衡二叉树,2-3搜索树得一些特点。
1.树
定义:树是一种数据结构,由n个节点构成具有层级结构得集合,由根向底部扩展,如下图:
特点:
1.每个节点有0个或多个子节点;
2.根节点没有父节点;
3.非根节点只有一个父节点;
4.除了根节点,每个子结点可以分为多个不相交得子树。
术语:
1.节点的度:节点子树的个数
2.树的度:树中结点最大的度
3.叶子的节点:度为0的节点
4.分支节点:度不为0
5.层次:根节点层次为1,其他节点为其父节点层次+1
6.高度:树中节点最大层次
2.二叉树
每个节点最多有两个子节点的树,如图:
完全二叉树
一棵二叉树只有最下面两层节点的度可以小于2,并且叶子节点在左侧,如图:
二叉搜索树
整棵树不存在值相等的节点,且每个节点左子树节点的值小于其值,右子树节点的值大于其值。
平衡二叉树
二叉搜索树的每个节点左右子树高度差的绝对值不大于1。
如何保持平衡?通过平衡因子(BF),BF=左右子树高度差的绝对值,如果大于1则认为失衡,进行旋转操作。
两种旋转:
左旋:旧根节点(BF失衡的点)作为新根节点的左子树,新根节点左子树为旧节点右子树;
右旋:旧根节点(BF失衡的点)作为新根节点的右子树,新根节点左子树为旧节点左子树;
四种纠正方式:
1.LL型,直接右旋
2.RR型,直接左旋
3.LR型,先左旋,再右旋
4.RL型,先右旋,再左旋
作用:保证了搜索数据的时间复杂度为OlogN,这就解决了二叉搜索树退化成链表导致时间复杂度上升为OlogN2
二 2-3树
拥有2-节点 和3-节点,并且和二叉搜索树类似,左边的小右边的大;
2-节点:普通节点,一个节点一个值,两个子树;
3-节点:一个节点俩值,三个子树,左子树都小,右子树都大,中间的介于俩值之间。
特点:插入时并不会直接增加树的高度,再找到对应位置时,将父节点变为3-节点或者4-节点
后面再将4-节点分解,将中间值拿到上边如果形成4-节点就继续分解,剩下两个分为两个2-节点,这样就相当于增加根节点,也就说2-3树是向上增长的,这也就是绝对平衡。
三、红黑树
红黑树就是通过二叉搜索树的形式,加上其他信息来表示2-3树。
红黑树通过一条左斜的红链接,连接两个2-节点来形成3-节点,黑链接则是普通节点。
3-节点:
红连接:
所有在这里,红黑树的特点为:
1.红连接均为左连接(因为2-3树转为红黑树的方法是左斜)
2.没有任何一个节点同时和两条红连接项链(因为2-3树种不存在4叉)
3.树是黑色平衡的,即任意空节点到根节点的距离相同,因为2-3树是平衡的,2-3中的连接都是黑色的,红色的连接只是将3-节点转化为2-节点而产生的,所以如果去掉红色连接,应该满足黑色平衡。4.根节点为黑色
5.新插入的节点为红色
因为不允许两个连续的红连接,所以最长路径不会超过最短路径的二倍。
插入规则:
1.旋转:
如果出现红色右链接,则需要左旋
出现两个红色左连接,需要右旋:
LR型红链接,先左旋再右旋:
2.变色:
1.根节点总是黑色的
2.节点拥有两个红链接时需要颜色转换:
如果是根节点,转换后还是黑色:
红黑树与AVL的比较和选择
AVL查询时间复杂度是Ologn,而红黑树是黑平衡所以最坏情况下时间复杂度为O(2logn)
两者的插入 删除 的时间复杂度都是Ologn,但是红黑树插入删除时的旋转操作要少于AVL,因此性能上略优于AVL,因此,如果插入删除较多时选择红黑树。
红黑树与2-3树比较
红黑树没有达到2-3的绝对平衡,但是它提升了速度,而且能保证黑色平衡,最长路径不超过最短路径的二倍,基本保证Ologn,而且2-3树的结构不利于维护,因此多数情况下红黑树性能更高。
总结
实际应用中,红黑树使用较多,比如map和set的底层实现,epoll的实现等。