红黑树你搞懂了没

红黑树的定义比较简单,无非是在插入和删除的过程中自平衡规则多了一些,不过再多也只是个位数而已

Linux虚拟内存管理,Java中的TreeMap和TreeSet,以及JDK1.8之后的HashMap也有用到红黑树数据结构


红黑树是一种 自平衡 的二叉树,所谓的自平衡是指在插入和删除的过程中,红黑树会采取一定的策略对树的组织形式进行调整,以尽可能的减少树的高度,从而节省查找的时间。

红黑树的特性如下:

1.结点是红色或黑色
2.根结点始终是黑色
3.叶子结点(NIL 结点)都是黑色
4.红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续的红色结点)
5.从任一结点到每个叶子的所有简单路径都包含相同数目的黑色结点


以上性质保证了红黑树在满足平衡二叉树特征的前提下,还可以做到 从根到叶子的最长路径最多不会超过最短路径的两倍 ,这主要是考虑两个极端的情况,由性质 4 和 5 我们可以知道在一棵红黑树上从根到叶子的最短路径全部由黑色结点构成,而最长结点则由红黑结点交错构成(始终按照一红一黑的顺序组织),又因为最短路径和最长路径的黑色结点数目是一致的,所以最长路径上的结点数是最短路径的两倍。

自平衡策略
对于一棵红黑树的操作最基本的无外乎增删改查,其中查和改都不会改变树的结构,所以与普通平衡二叉树操作无异。剩下的就是增删操作,插入和删除都会破坏树的结构,不过借助一定的平衡策略能够让树重新满足定义。

平衡策略可以简单概括为三种: 左旋转 、 右旋转 ,以及 变色 。

在插入或删除结点之后,只要我们沿着结点到根的路径上执行这三种操作,就可以最终让树重新满足定义。

左旋转
对于当前结点而言,如果右子结点为红色,左子结点为黑色,则执行左旋转,如下图:

https://github.com/plotor/algorithm-design

演示的网站:

https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

 再说一说二叉树

 https://www.processon.com/view/5b3b413ee4b056f7f0beae42

猜你喜欢

转载自www.cnblogs.com/qianjinyan/p/11151790.html