1、在理解红黑树以前,先看一些二叉查找树java
二叉查找树特性:左字数上全部的节点的值都小于或等于他的根节点上的值数组
右子树上全部节点的值均大于或等于他的根节点的值3d
左、右子树也跟别为平衡二叉树blog
举个二叉树的例子:class
能够看到若是要查询10的话,10>9二叉树
所以到他的右子树,右子树根节点为13,10<13遍历
所以到其左子树,左子树根节点为11>10im
到其左子树,为10,找到相应的节点d3
不过二叉查找树有一些问题,可能会出现不平横的状况,即以下图所示的状况链表
从这种状况能够看出,明显存在左子树和右子树深度相差过多,在使用平衡状况下的二叉查找树是时间复杂度为logn,而出现这种极端状况的话,想要查9的位置就须要每一次都遍历下一个右子树,颇有可能时间复杂度变为n(与数组普通查询的时间复杂度相同)
基于上述状况,引入了平衡二叉树,红黑树即为平衡二叉树的一种
2、红黑树
特性:节点是红色或黑色
根节点必定是黑色
每一个叶节点都是黑色的空节点(NIL节点)
每一个红节点的两个子节点都是黑色的(从每一个叶子到跟的全部路径上不能有两个连续的红节点)(即对于层来讲除了NIL节点,红黑节点是交替的,第一层是黑节点那么其下一层确定都是红节点,反之同样)
从任一节点到其每一个叶子节点的全部路径都包含相同数目的黑色节点
正是因为这些缘由使得红黑树是一个平衡二叉树
红黑树的例子
向红黑树中插入节点14(通常默认插入节点是红色的)
在原树上插入20
能够看到,插入之后树已经不是一个平衡的二叉树,并且并不知足红黑树的要求,由于20和21均为红色,这种状况下就须要对红黑树进行变色,21须要变为黑色,22就会变成红色,若是22变成红色,则须要17和25都变成黑色
而17变成黑色显然是不成立的,由于若是17变为黑色,那么13就会变为红色,不知足二叉树的规则,所以此处须要进行另外一个操做---------左旋操做
左旋:下图就是一个左旋的例子,通常状况下,若是左子树深度过深,那么便须要进行左旋操做以保证左右子树深度差变小
对于上图因为右子树中17变为黑色之后须要把13变成红色,所以进行一次左旋,将17放在根节点,这样既可保证13为红色,左旋后结果
然后根据红黑树的要求进行颜色的修改
进行左旋后,发现从根节点17,到1左子树的叶子节点通过了两个黑节点,而到6的左叶子节点或者右叶子节点要经历3个黑节点,很显然也不知足红黑树,所以还须要进行下一步操做,须要进行右旋操做
右旋:与左旋正好相反
因为是从13节点出现的不平衡,所以对13节点进行右旋,获得结果
然后再对其节点进行变色,获得结果
这即是红黑树的一个变换,它主要用途有不少,例如java中的TreeMap以及JDK1.8之后的HashMap在当个节点中链表长度大于8时都会用到。