1.红黑树
红黑树是一棵二叉搜索树
,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或者black,通过对任何一条从根结点到叶子结点简单路径上的颜色来进行约束,红黑树保证最长路径不超过最短路径的2倍,因而近似平衡,而且在实际应用中红黑树比AVL树的性能高
2.红黑树的性质
1.每一个结点都是有颜色的,不是红色就是黑色;
2.树的根结点是黑色的;
3.如果一个结点是红色的,那它的孩子结点必须是黑色—->在红黑树中没有连在一起的红色
4.对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点—>每条路径上的黑色结点个数都是相等的
5.每个叶子结点都是黑色的
此处的叶子结点指的是—->树中的空指针域
为什么把叶子结点理解树中的空指针域?
当一个树一个结点都没有,性质2说树的根结点是黑色的,为了配合性质2,故必须为黑色
ps:树为空的话,认为树是有一个空结点的
3.红黑树和AVL树的比较
共同点:
1.红黑树和AVL树都是高效的平衡二叉树
2.增删查改的时间复杂度都是O(log2N)
不同点
:
1.红黑树不追求完全平衡,保证最长路径不超过最短路径的2倍
2.红黑树实现方式简单,灵活
3.AVL树实现起来较复杂,每走一步都需要处理平衡因子
4.红黑树的插入操作
(1)叔叔结点存在且为红色
情况1:cur和p为红色,g为黑色,p为g的左孩子,u为p的右孩子,cur为p的左孩子
情况1的镜像:cur和p为红色,g为黑色,p为g的右孩子,u为p的左孩子,cur为p的右孩子
(2)叔叔结点不存在或者叔叔结点存在颜色为黑色
情况2:cur和p为红色,g为黑色,p为g的左孩子,u为g的右孩子,cur为p的左孩子
情况2的镜像:cur和p为红色,g为黑色,p为g的右孩子,u为g的左孩子,cur为p的右孩子
情况3:cur和p为红色,g为黑色,p为g的左孩子,u为g的右孩子,cur为p的右孩子
情况3的镜像:cur和p为红色,g为黑色,p为g的右孩子,u为g的左孩子,cur为p的左孩子
在进行红黑树的插入操作时,当插入结点时,默认待插入结点的颜色是红色
1.默认是红色的话,只有待插入结点的父节点是红色时,才需要调整树中相关
结点的颜色,如果父节点是黑色,那就直接插入,不需要处理树中相关结点
的颜色
2.默认是黑色的话,每插入一个结点,都需要调整树中相关结点的颜色,因为
红黑树的性质4说--->每条路径上的黑色结点个数必须相等,所以只要插入
结点就必须对树中相关结点的颜色进行调整
默认待插入结点的颜色是红色时,插入结点可能不需要对树中相关结点的颜色进行调整,而默认待插入结点的颜色是黑色时,只要插入结点就必须对树中相关结点的颜色进行调整—->
故默认待插入结点的颜色是红色