希望找到一种数据结构,能够保证所有操作(范围查找除外)均能够在对数时间内完成操作,以便改变二叉查找树的不足。
平衡查找树Balance Search Tree
一.2-3查找树
1.数据结构:每个结点允许1个或者两个key
(1)2-node:一个键,两个child。左子树小于该节点,右子树大于该节点。
(2)3-node:两个键,三个child。左子树小于两个节点,右子树大于两个节点,中间的子树在两个节点之间。
这个限定称为symmetric order
2.完美平衡(Perfect balance):所有空链接到根结点的距离应该相等。
3.查找的思路:根据2-3查找树的概念,从根开始递归的查找该元素。和二叉查找树类似。
4.插入的思路:(保持完美平衡和symmetric order)
(1)如果在底部的2-node中插入,查找key应该插入的位置,然后将2-node变为3-node
(2)如果在底部的3-node中插入
1)在3-node中增加一个key,暂时形成4-node
2)将4-node中中间的一个移动到父结点中
3)如果不满足2-3的结构的话,重复上面的过程
4)如果已经到达了根结点,并且根结点是一个4-node,则将它拆分为3个2-node,也就是使得树的层次+1
5.三种情况举例:
(1)插入K(2-node变为3-node)
-------------》
(2)插入Z(临时4-node移动到父结点)
--------------------》
(3)插入L(根结点都满了,增加树的高度)
--------》
------》
6.说明:
(1)树的高度。最坏的情况,全为2-nodes,性能是lgN。最好的情况,全为3-nodes,性能是logN/log3。
(2)对于million结点来说,树的高度在12到20之间。对于billion结点来说,高度在18到30之间。
(3)可以保证clgN的性能。
(4)直接的实现很复杂
二.红黑二叉查找树red-black BSTs
1.基本思想:利用标准的二叉查找树和一些额外的信息来表示2-3树
(1)红链接将2-node连接起来构成3-node
(2)黑链接则是2-3树中的普通链接
(3)3-node中较大的key是root
2.另一个等价的定义:红黑树(left-leaning red-black BST)是一个含有红黑链接的特殊的二叉查找树,满足:
(1)没有一个结点同时和两个红链接相连
(2)该树是完美黑色平衡。即任意空链接到根结点的路径上的黑链接数量相同
(3)红链接均为左链接。
3.从上面的分析可以,红黑树是 2-3树的一种等价的简单的实现。
4.查找。和普通的BST类似(不考虑颜色),但是由于具有更好的平衡性,红黑树有更快的查找速度。
很多其他的操作(ceiling,selection等),也和普通的BST类似。
5.用BST表示红黑树。颜色表示,在普通BST的实现中给每个Node加上一个颜色(布尔值),表示父链接的颜色是红(true)/黑(false)。
6.左旋转。将一个右倾斜的红链接变为左倾斜。依旧维持了symmetric order和完美黑色平衡。
--------------------》
//左旋转,将右倾斜变为左倾斜 Node rotateLeft(Node h) { //结点关系 Node x=h.right; h.right=x.left; x.left=h; //颜色 x.color=h.color; h.color=RED; return x; }