红黑树与AVL树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。
特点:
AVL树:
性质1.本身首先是一棵二叉搜索树。
性质2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。
红黑树:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3.所有叶子都是黑色。(叶子是NUIL节点)
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5… 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
插入和删除节点:
红黑树:
1.节点插入算法
插入过程首先是根据一般二叉查找树的插入步骤, 把新节点 z 插入到 某个叶节点的位置上,然后将 z 着 为红色。 为了保证红黑树的性质能继续保 持,再对有关节点重点着色并旋转,其插入算法如下:
RB-INSERT (T,z)
{
1 按二叉查找树的插入步骤将节点 z 插入到 T 中;
2 color[z]=RED;
3 while(z 不是根节点 &&color[z->parent]= =RED) {Insert-Fixup(T,z);}
4 color[root[T]]=BLACK;
}
对上述算法分析,如果新插入的是黑色节点,那么它所在的路径上就多出一个黑色的节点,所以新插入的节点一定要设成红 色。 但是如果 z 的父节点也是红色,这就违反了每个红色节点的两个子节点都黑色的性质。
2.节点删除算法
与红黑树的的插入算法一样,对一个节点的删除算法要花 O(log n)时间,只是删 除算法略微复杂些,删除算法如下:
RB-DELETE(T,z)
{
1 if (z 的左右子节点均为 NIL)
2 { NIL 节点代替 z 的位置; delete(z); }
3 else if (z 有一个子节点为 NIL)
4 {z 的非 NIL 子节点代替 z 的位置;delete(z); }
5 else
6 {将红黑树中序遍历中 z 的后继节点 s 的值赋给 z; delete(s); }
7 if (删除的节点是黑色的) Delete-Fixup(T,x); /*x 指向代替删除节点的节点 */
}
AVL树:
1.节点插入
2.节点删除
(1)删除节点没有左子树,这种情况直接将删除节点的父节点指向删除节点的右子树。
(2)删除节点没有右子树,这种情况直接将删除节点的父节点指向删除节点的左子树。
(3)删除节点左右子树都存在,可以采用两种方式,
1:让删除节点左子树的最右侧节点代替当前节点
2:让删除节点右子树的最左侧节点代替当前节点
例如s