AVL树介绍
AVL树是一种自平衡二叉搜索树,主要特点是保持树的高度平衡,以确保在最坏情况下,树的搜索、插入和删除等操作的时间复杂度保持在对数级别。
AVL树的平衡性是通过在插入或删除节点时执行旋转操作来维持的。在插入节点时,如果插入破坏了树的平衡,就会进行一系列的旋转操作来重新平衡树。
AVL树的平衡性要求,任何节点的左子树和右子树的高度差(平衡因子)不能超过1。当插入或删除节点导致某个节点的平衡因子超过了1或小于-1时,就需要进行旋转操作。
下面就是一颗平衡二叉树
例如9的左右子树,他们的高度都是1,所以9的平衡因子是1-1=0
而下面这棵树6的平衡因子是-2,所以不满足平衡二叉树,不是一颗平衡二叉树。
AVL的自平衡:假如一开始只有6和9这个节点,当插入10这个节点时,这颗树就会不平衡,此时AVL就会通过旋转操作,将这棵树变成上面的平衡树。
红黑树的介绍
红黑树也是一棵自平衡二叉搜索树,但是他有一些自身的特性,如下:
- 每个节点要么是红色,要么是黑色。
- 根节点是黑色的。
- 每个叶子节点(NIL节点)都是黑色的。
- 如果一个节点是红色的,则它的子节点必须是黑色的(不能有两个连续的红色节点)。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
下面是红黑树示例
这五个特性确保了确保了红黑树的关键特性,也就是从根到叶子的最长可能路径, 不会超过最短可能路径的两倍长。而这个关键特性就是能够保证这颗树基本是平衡的(比AVL树的平衡差一些)。
这个关键特性的推算过程如下:
- 首先第五点的特性决定了根节点到叶子节点的最短路径和最长路径必须有相同的黑色节点。
- 假设黑色节点共有n个
- 路径最短的情况:全部是黑色节点n个
- 路径最长的情况:全部节点中黑色节点是n个,红色节点最多是n-1个(为什么要算最多,因为是最长路径,所以必须要计算最多数量),为什么是n-1个,因为在最长路径中红黑节点只能是交替出现,才会使最长路径情况。例如下面的最短路径17-15-nil,最长路径17-25-22-20-nil。
- 最短路径中的路径就是边的数量,此时最短路径为n-1;
- 最长路径为(n+n-1)-1=2n-2;
- 所以得出最长可能路径不会超过最短可能路径的两倍长
红黑树和AVL树对比分析
(1)红黑树的性能在搜索上是不如AVL树的,为什么呢
下面举一个例子
如上图所示,符合红黑树的规则,所以他是一棵红黑树,此时有一个30的节点要插入这棵树中,并且是红色节点时,这个节点就会插入27的右孩子中,这个时候依然满足是一颗红黑树(因为加入一个红色节点没有改变根路径到每个叶子节点的路径中的黑色节点总数),所以红黑树此时不需要左任何操作。
结果如下图
而此时这棵树对于AVL来说是不平衡的,17节点就是不平衡的节点,左子树高度为1,右子树高度为3,平衡因子是-2,不满足AVL树,就需要通过旋转来恢复平衡。
最终结果就是红黑树高度比AVL树高度高,所以,红黑树在搜索性能上会低于AVL树,例如搜索30,红黑树需要对比4次找到,而AVL树只需要3次就能够找到。
(2)插入和删除操作时,红黑树效率更高
AVL树在插入和删除操作时,通常会进行更多的旋转操作来恢复树的平衡,而红黑树通常需要较少的旋转操作,所以红黑树效率高些。