定义
说到红黑树(R-B Tree),首先要知道它是一颗二叉查找树(二叉查找树(Binary Search Tree),又称二叉排序树(Binary Sort Tree),亦称二叉搜索树,下文统称为二叉查找树),其次才作为一颗红黑树。所以它不仅要满足二叉查找树的规则,而且要满足红黑树的规则。如下:
- 二叉查找树
- 规则一:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 规则二:若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 规则三:左、右子树也分别为二叉查找树;
- 红黑树
- 规则一:每个节点或者是黑色,或者是红色;
- 规则二:根节点是黑色;
- 规则三:每个叶子节点(NIL)是黑色; -(注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点)==
- 规则四:如果一个节点是红色的,则它的子节点必须是黑色的;==(注意:此规则表明红黑树中不可能有连续的两个红色节点,但可以有连续的两个甚至大于两个的黑色节点,且黑色节点的两个子节点可以是不同颜色的)==
- 规则五:从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点;==(注意:此规则确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对接近平衡的二叉树)==
所以一颗标准的红黑树是要满足以上七个规则的!(下文所说的规则除非特别指明为二叉查找树规则,否则统指的是红黑树的五个规则)
应用场景
- JDK集合类TreeMap;
- JDK集合类TreeSet;
- Java8中HashMap;
- ……
为什么选择红黑树
既然我们已经有了二叉查找树了,为什么还要弄出一个特殊的二叉查找树红黑树呢?原因是二叉查找树存在一定的缺陷,主要体现在插入方面,例如我们现有二叉查找树如下:
接下来我们依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?
虽然形态符合二叉查找树的规则,但几乎变成了线性,查找效率大大降低!由此红黑树应运而生。
红黑树的时间复杂度
红黑树的时间复杂度为O(lgn)
引例:一棵有n个内节点的红黑树高度至多为2lg(n+1);
证明:
先证明某一节点x为根的子树中至少包含2^(bh(x)) - 1个内节点(归纳假设);
如果:x高度为0,则x必为叶子节点,这时以x为根的子树至少包含2^(bh(x)) - 1 = 2^0 - 1= 0,
考虑x为正数,并且x有两个孩子,两个孩子的高度为bh(x)或bh(x)-1(根据孩子自身的红黑性质决定),所以假设每个孩子至少包含2^(bh(x)-1) - 1个内节点,则x = 2*(2^(bh(x)-1) - 1) + 1(x本身),则x = 2^(bh(x)) - 1,得证
根据规则四(如果一个节点为红,则其孩子必为黑)可知,高度为h的树的黑高度至少为h/2
所以 n >= 2^(h/2) - 1,所以lg(n+1) <= h/2,所以可知一个有n个内节点的红黑树高度至多为2lg(n+1),得证
红黑树的查找长度最多不超过2lg(n+1),因此其查找时间复杂度是O(lg N)