浅谈红黑树

Posted lis-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈红黑树相关的知识,希望对你有一定的参考价值。

红黑树是什么?

其实也是平衡二叉树,只是给每个节点标了红黑颜色

 

为什么需要红黑树?

红黑树其实基础还是二叉查找树,只是因为二叉查找树很容易出现不平衡的情况,最坏情况相当于O(n),红黑树和AVL树应运而生,AVL树的话,因为平衡度要求是[-1,1]太严格,所以插入和删除的时候的效率并不是很高,比不上红黑树,但是因为平衡度是[-1,1],所以查找速度比红黑树快,AVL适用于频繁查找,红黑树适用于频繁插入和删除

 

红黑树五大特性

1,每个节点不是黑色就是红色

2,根节点肯定是黑色

3,叶子节点肯定是黑色

4,红色节点的叶子节点肯定是黑色(也就是没有两个红色节点连续)

5,从树的任意一个节点出发往叶子走的所有路径,经过的黑色节点数肯定相同

基于这些特性形成了红黑树的平衡,(任意一个节点出发到叶子节点的最长路径肯定不超过最短路径的一倍),因为最短的肯定是全黑,最长肯定是红黑交叉

 

 

查找,插入,删除大部分操作和二叉查找树相同,只是多了要修改平衡的地方,下面特别说一下插入和删除

红黑树有三大操作,基于这些操作才完成的平衡

1,换色   把红色改成黑的,黑的改成红的

2,左旋    和二叉查找一样,不做赘述

3,右旋    和二叉查找一样,不做赘述

插入三大步骤

1,像二叉查找树一样找到插入位置插入节点

2,把插入的节点标记成红色(因为插入红色才不会影响第五条特性)

3,如果破坏平衡,进行修复

 

插入节点的几种情况

1,空树

直接插入,但是因为插入的是红色节点,根节点要是黑色, 所以进行换色操作

2,插入节点已经存在

把新的这个节点替换掉原来的那个,颜色改成和旧的一样的

3,插入位置的父节点是黑色

没得影响,不做处理

4,父亲节点是红色,叔叔节点是红色

直接把爷爷节点改成红色,父亲数数都改成是黑色

5,父亲节点是红色,叔叔节点是黑色

  5.1 插入节点 N 是父节点 P 的左节点且父节点 P 是祖父节点 PP 的左节点:

    把父节点和祖父节点换色,然后右旋

  5.2 插入节点是父节点的右节点且父节点 P 是祖父节点 PP 的左节点:

    把父节点和祖父节点换色,然后左旋

 

 

 

删除步骤

1,像二叉查找树一样找到删除节点

{

  1.1,叶子节点,直接删

  1.2    只有一个子树,直接接上去完事

  1.3     在右子树中找到最小值,也就是后继节点

}

2,修复平衡

修复平衡的话,我肯定是找到删除后的代替节点的位置,然后去修复,也就是找到由下而上的第一个错的位置,也就是真正删除节点的子树位置

 

不想画图,依旧文字表示完事儿

1,接替节点的兄弟是红色的

  兄弟父亲换色,然后左旋

2,接替节点的兄弟是黑色,且兄弟的俩个孩子也都是黑色的

  兄弟改成是红色

3,接替节点的兄弟是黑色的,并且兄弟的左孩子是红色,右孩子为黑色

  兄弟左孩子和自己换色,然后右旋

4,接替的兄弟是黑色的;并且兄弟的右孩子是红色的,左孩子任意颜色。

  兄弟改成父亲颜色,父亲换色,右儿子换色,然后左旋

 

核心:其实这些操作都是基于想弥补平衡,因为删除的是黑色,所以经过删除位置的路径都会少一个黑色,这个时候就由两个选择去操作1,自己这边改出一个黑色(自己+1)2,兄弟这边弄个红色(兄弟-1),基本思想是这个,然后由下而上的把问题节点推上去,直到完成

 

参考博文

https://www.cnblogs.com/alantu2018/p/8462017.html

https://www.jianshu.com/p/0eaea4cc5619

https://segmentfault.com/a/1190000021366480?utm_source=tag-newest

以上是关于浅谈红黑树的主要内容,如果未能解决你的问题,请参考以下文章

浅谈红黑树的添加删除操作

浅谈红黑树——java面试拦路虎

C++ 红黑树

二叉树红黑树

数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~红黑树

二叉树红黑树以及Golang实现红黑树