介绍
- R-B Tree全称Red-Black Tree,又名红黑树
- 1972年由鲁道夫.贝尔发明
- 一种自平衡二叉查找树
- 二叉查找树每个节点增加一个存储位表示节点的颜色,非黑即红
- 时间复杂度O(log n)
- 二叉查找树?
- 平衡二叉查找树?
二叉查找树
- Binary Search Tree
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
- 任意节点的左、右子树也分别为二叉查找树
- 没有键值相等的节点
- 时间复杂度O(log n)(最好的情况下)
- 例子
- 二叉查找树
- 退化成线性的二叉查找树,时间复杂度O(n)
平衡二叉查找树
- AVL
- 任何一个节点的左子树与右子树都是平衡二叉查找树,且高度之差的绝对值不超过1(即平衡因子:左子树高度-右子树高度,1 or 0 or -1)
- 严格的平衡二叉查找树
- 对于查找友好,对于插入、删除不够友好,频繁破坏规则,频繁旋转以适应规则
- 例子
RB特性
- 每个节点或者黑色,或者红色
- 根节点是黑色
- 每个叶子节点(NIL)是黑色(注:此处叶子节点,指为空(NIL或NULL)的叶子节点)
- 如果一个节点是红色的,则它的子节点必需是黑色的
- 对任意节点,其到叶子节点(NIL)的每条路径都包含相同数目的黑色节点
- 例子
时间复杂度
- 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1)
- 逆否命题:高度为h的红黑树,包含的内节点个数至少为 $2^{h/2}-1$ 个
- 黑高:从某个节点X(不包含该节点)触发,到达一个叶子节点的任意一条路径上,黑色节点的个数称为该节点的黑高度,记为bh(x)
- 根据特性5,从节点X到达所有叶子节点具有相同数目的黑节点,即bh(x)的值是唯一的!
- 根据特性4,从节点X到达所有叶子节点所经历的黑节点数目>=所经历的红节点的数目。假设X为根节点,则hb(x)>=h/2,代入上面的逆否命题公式。则逆否命题公式变为: 高度为h的红黑树,包含的黑节点个数至少为$2^{bh(x)}-1$个
- 数学归纳法
- 当h=0时,则黑高bh(x)=0,$2^{bh(x)}-1=0$。原命题成立
- 当h>0时,设树高度为h,对于节点X(X为根节点),其黑高度为bh(x)。对于节点X的左右子树,黑高度为bh(x)或者bh(x)-1
- 归纳假设,左、右子树至少包含$2^{bh(x)-1}-1$个内部节点
- 所以,节点X所包含的节点树至少为 $$(2^{bh(x)-1}-1)+(2^{bh(x)-1}-1)+1=2^{bh(x)}-1$$ 即节点X所包含的节点至少为$2^{bh(x)}-1$,原命题成立
- 综上,高度为h的红黑树,包含的黑节点个数至少为$2^{bh(x)}-1$个,因此,一棵含有n个节点的红黑树的高度至多为2log(n+1)
应用
- JDK 1.8 HashMap
- Linux普通进程调度,用红黑树管理进程控制块
- Nginx中用红黑树管理定时器
- IO多路复用epoll实现采用红黑树管理sockfd
来源:oschina
链接:https://my.oschina.net/u/3163032/blog/4850482