数据结构:红黑树的图解

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说--->每条路径上的黑色结点个数必须相等,所以只要插入
     结点就必须对树中相关结点的颜色进行调整

默认待插入结点的颜色是红色时,插入结点可能不需要对树中相关结点的颜色进行调整,而默认待插入结点的颜色是黑色时,只要插入结点就必须对树中相关结点的颜色进行调整—->故默认待插入结点的颜色是红色

猜你喜欢

转载自blog.csdn.net/dangzhangjing97/article/details/79904480