红黑树是一种特殊的二叉查找树,除了二叉查找树的基本特性外它还有自平衡的功能;
基础-二叉查找树
特点
- 左子树上所有节点的值均小于或等于它根节点的值;
- 右子树上所有节点的值均大于或等于它根节点的值;
- 左、右子树也分别为二叉查找树;
- 中序遍历后,是一个从小到大的有序队列
删除结点
二叉查找树删除结点共分三种情况:
情况一:待删除的结点没有子结点
直接删除即可
情况二:待删除的结点有一个孩子
待删除的结点直接被子结点取代即可
情况三:待删除的结点有两个孩子
由中序遍历,找出待删除结点的前后两个结点,选出一个来替代待删除结点(一般选取右边值较大的结点);循环删除多余结点即可
思想
利用二分查找的思想组织数据,查找所需的最大次数等同于二叉查找树的高度;
缺点
二叉查找树多次插入新结点导致不平衡,例如依次往二叉查找树中插入 7 6 5 4 3
正题-红黑树
为解决二叉查找树不平衡的问题,红黑树出现了,定义了一系列规则来限制红黑树,保证了从根结点到叶子的最长路径不会超过最短路径的两倍,下面介绍红黑树的相关知识。
特性
- 结点为红色或黑色;
- 根节点是黑色;
- 每个叶子结点都是黑色的空结点;
- 每个红色结点的两个子结点都是黑色。
- 从任意一结点到其每个叶子结点所包含相同数目的黑色结点;
添加元素
- 往黑色结点下添加一个红色结点,这种情况并不会破坏红黑树的规则,如下图所示:
- 往红色结点下添加一个红色结点,这种情况打破了规则4(每个红色结点的两个子结点都是黑色),这种情况下需要作出调整,使之重新复核红黑树的规则。
调整方法
变色
为了重新符合红黑树的规则,可尝试把红色结点变为黑色,或者把黑色结点变为红色
旋转
左旋转
逆时针旋转红黑树的两个结点,是的父结点黑自己接的右孩子取代,而自己则调整左孩子的位置
右旋转
同左旋转概念
添加元素调整红黑树规则
在红黑树插入新结点的时候,可以分为5种不同的局面,每一种局面有不同的调整方法:
局面一:新结点位于树根,没有父结点
调整方法:直接让新结点变为黑色,使规则二得到满足。。同事根结点使得每条路径上的黑色结点都增加了1,所以没有打破规则。
局面二:新结点(B)的父结点是黑色的
这种局面,新插入的红色结点B并没有打破红黑树的规则,所以不需要做调整。
局面三:新结点(D)的父结点和叔叔结点都是红色
这种局面,两个红色结点连续,违反了规则4,因此我们先让结点B变为黑色:
调整后,结点B所在的路径凭空多了一个黑色结点,打破了规则5.因此调整A结点变为红色:
这时,结点A和结点C成为了连续的红色结点,我们再让结点C变为黑色:
调整后,这一局面重新符合红黑树的规则。
局面四:新结点(D)的父节点是红色,叔叔结点是黑色或者没有叔叔结点,且新结点的父结点(B)是祖父结点(A)的左子结点
我们以B结点为轴,做一次左旋转,使新结点D成为父结点,原来的父结点成为D的左孩子:
这样一来,进入了局面五
局面五:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,且新结点是父结点的左孩子,父结点(B)是父结点的左孩子
我们以结点A为轴,做一次右旋转,使得结点B成为祖父结点,结点A成为结点B的右孩子:
接着,让B结点变为黑色,A结点变为红色:
调整后,这一局面重新符合了红黑树的规则。
删除元素调整红黑树规则
bla…bla…反正很复杂,记不住
AVL树和红黑树的区别
AVL树是严格平衡的二叉树,要求每个结点的左右子树高度不超过1;而红黑树则要宽松一些,要求任何一条路径的长度不超过其他路径长度的两倍。
正因为这个区别,AVL树的查找效率比红黑树高,而红黑树的插入和删除效率比AVL树高。