红黑树属于平衡二叉树。它不严格是由于它不是严格控制左、右子树高度或节点数之差小于等于1,但红黑树高度依然是平均log(n),且最坏状况高度不会超过2log(n)。数据结构
红黑树(red-black tree) 是一棵知足下述性质的二叉查找树:指针
1. 每个结点要么是红色,要么是黑色。数学
2. 根结点是黑色的。二叉树
3. 全部叶子结点都是黑色的(实际上都是Null指针,下图用NIL表示)。叶子结点不包含任何关键字信息,全部查询关键字都在非终结点上。搜索
4. 每一个红色结点的两个子节点必须是黑色的。换句话说:从每一个叶子到根的全部路径上不能有两个连续的红色结点数据
5. 从任一结点到其每一个叶子的全部路径都包含相同数目的黑色结点查询
红黑树相关定理红黑树
1. 从根到叶子的最长的可能路径很少于最短的可能路径的两倍长。语言
根据上面的性质5咱们知道上图的红黑树每条路径上都是3个黑结点。所以最短路径长度为2(没有红结点的路径)。再根据性质4(两个红结点不能相连)和性质1,2(叶子和根必须是黑结点)。那么咱们能够得出:一条具备3个黑结点的路径上最多只能有2个红结点(红黑间隔存在)。也就是说黑深度为2(根结点也是黑色)的红黑树最长路径为4,最短路径为2。从这一点咱们能够看出红黑树是 大体平衡的。 (固然比平衡二叉树要差一些,AVL的平衡因子最多为1)时间
2. 红黑树的树高(h)不大于两倍的红黑树的黑深度(bd),即h<=2bd
根据定理1,咱们不难说明这一点。bd是红黑树的最短路径长度。而可能的最长路径长度(树高的最大值)就是红黑相间的路径,等于2bd。所以h<=2bd。
3. 一棵拥有n个内部结点(不包括叶子结点)的红黑树的树高h<=2log(n+1)
下面咱们首先证实一颗有n个内部结点的红黑树知足n>=2^bd-1。这能够用数学概括法证实,施概括于树高h。当h=0时,这至关因而一个叶结点,黑高度bd为0,而内部结点数量n为0,此时0>=2^0-1成立。假设树高h<=t时,n>=2^bd-1成立,咱们记一颗树高 为t+1的红黑树的根结点的左子树的内部结点数量为nl,右子树的内部结点数量为nr,记这两颗子树的黑高度为bd'(注意这两颗子树的黑高度必然一 样),显然这两颗子树的树高<=t,因而有nl>=2^bd'-1以及nr>=2^bd'-1,将这两个不等式相加有nl+nr>=2^(bd'+1)-2,将该不等式左右加1,获得n>=2^(bd'+1)-1,很显然bd'+1>=bd,因而前面的不等式能够 变为n>=2^bd-1,这样就证实了一颗有n个内部结点的红黑树知足n>=2^bd-1。
在根据定理2,h<=2bd。即n>=2^(h/2)-1,那么h<=2log(n+1)
从这里咱们可以看出,红黑树的查找长度最多不超过2log(n+1),所以其查找时间复杂度也是O(log N)级别的。
红黑树的操做
由于每个红黑树也是一个特化的二叉查找树,所以红黑树上的查找操做与普通二叉查找树上的查找操做相同。然而,在红黑树上进行插入操做和删除操做会致使不 再符合红黑树的性质。恢复红黑树的属性须要少许(O(log n))的颜色变动(实际是很是快速的)和不超过三次树旋转(对于插入操做是两次)。 虽然插入和删除很复杂,但操做时间仍能够保持为 O(log n) 次 。
红黑树的优点
红黑树可以以O(log2(N))的时间复杂度进行搜索、插入、删除操做。此外,任何不平衡都会在3次旋转以内解决。这一点是AVL所不具有的。
并且实际应用中,不少语言都实现了红黑树的数据结构。好比 TreeMap, TreeSet(Java )、 STL(C++)等。