平衡二叉树(AVL树)
平衡因子
结点的平衡因子=左子树高度-右子树高度
平衡二叉树
或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的高度之差(平衡因子)的绝对值不超过1 ,且它的左子树和右子树都是一颗平衡二叉树。
问题
怎样让平衡二叉树在经过任意的插入和删除后,依然保持平衡?==>红黑树
红黑树 R-B Tree (自平衡二叉查找树)
红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。
定义一:
红黑树是每个结点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
- 结点是红色或黑色。
- 根是黑色。
- 所有叶子都是黑色(叶子是NIL结点,也称外结点)。
每个红色结点必须有两个黑色的子结点。
(从每个叶子到根的所有路径
不能有两个连续的红色结点。)- 从任一结点到其每个叶子的所有简单路径都包含
相同数目的黑色结点
(包含的黑色结点的数育,称为该结点的黑高度)
例:
树中的每个结点包括五个域: color , key , left , right和p。叶子结点是p为NIL (或null )的结点,可理解为标识查找失败的结点,它们到达根结点的路径上黑结点的数目是相同的。
定义二:
红黑树是每个结点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的T黑树我们增加了如下的额外要求:
- 把结点和父母结点的链接标识为红色或黑色两种;称为红链接和黑链接。
- 红链接均为左链接。
- 没有任何一个结点
同时和两个红链接相连
。 - 该树是
完美黑色平衡的
,即任意空链接到根结点的路径上黑链的数目相同。
例:
利用定义二判断红黑树:
非红黑树转换为红黑树图示:
红黑树结点定义
private class Node {
private Key key; //键
private Value val; //值
private Node left, right; // 左右指针域
private boolean color; //和父结点链接的颜色
private int size; // 对应子树的结点数
public Node(Key key,Value val,boolean color,int size) {
this.key = key;
this.val = val;
this.color = color;
this.size = size;
}
左旋转( rotateLeft )
private Node rotateLeft(Node h) {
Node x = h.right;
h.right = x.left;
x.left = h;
x.color = x.left.color;
x.left.color = RED;
x.size = h.size;
h.size = size(h.left) + size(h.right) + 1;
return X;
右旋转( rotateRight )
private Node rotateRight(Node h) {
Node x = h.left;
h.left = x.right;
x.right = h;
x.color = x.right.color;
x.right.color = RED;
x.size = h.size;
h.size = size(h.left) + size(h.right) + 1;
return X;
颜色转换( flipColors )
private void flipColors(Node h) {
h.color = !h.color;
h.left.color = !h.left.color;
h.right.color = !h.right.color;