红黑树的特色 java
(1)每一个节点都是黑色,或者是红色。linux
(2)根节点是黑色。blog
(3)每一个叶子节点(NIL)是黑色。【这里的叶子节点指的是空(NIL/NULL)的叶子节点】内存
(4)若是一个节点是红色的,则它的子节点必定是黑色的。内存管理
(5)从一个节点到这个节点的子孙节点的全部的路径上有相同数目的黑色节点。class
注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其余路径长出俩倍。于是,红黑树是相对是接近平衡的二叉树。效率
红黑树的应用原理
主要用来存储有序的数据,它的时间复杂度是O(lgN),效率很是之高。如java中的TreeMap, TreeSet,C++ STL中的set map 以及二叉树
linux的虚拟内存管理,都是经过红黑树来实现的。map
红黑树的基本操做(一)左旋和右旋
红黑树的基本操做中添加和删除。在对红黑树进行添加和删除后,都会用到旋转的方法,由于添加和删除会让树的结构发生变化,可能再也不知足红黑树的
性质。经过旋转,咱们可使它又成为一个红黑树。
基本定义
见代码中的RBNode
旋转总结
(1)左旋和右旋是相对的两个概念,原理相似。
(2)下面是如何区分左旋和右旋。
区分左旋与右旋
仔细观察上面"左旋"和"右旋"的示意图。咱们能清晰的发现,它们是对称的。不管是左旋仍是右旋,被旋转的树,在旋转前是二叉查找树,而且旋转以后仍然是一颗二叉查找树。
左旋示例图(以x 为节点)
z x / / \ --(左旋)--> x y z / y
对x 进行左旋,意味着将x 的右孩子 设为x 的父亲节点,也就是,将x 变成了一个左节点(x成了为z的左孩子)。所以,左旋转中的左,意味着被旋转的节点将变成一个左节点。
右旋示例图
y x \ / \ --(右旋)--> x y z \ z
对x进行右旋,意味着,将“x的左孩子”设为“x的父亲节点”;即,将 x变成了一个右节点(x成了为y的右孩子)! 所以,右旋中的“右”,意味着“被旋转的节点将变成一个右节点”。