红黑树和AVL树

一,AVL树(平衡二叉树)
(1)简介
AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树的高度差不超过1,和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差的绝对值不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。
(2)局限性
由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树
(3)应用
1.Windows NT内核中广泛存在;

二、红黑树
(1)简介
一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍(即同一父节点出发到叶子节点,所有路径上的黑色节点数目一样),因此,红黑树是一种弱平衡二叉树,在相同的节点情况下,AVL树的高度低于红黑树相对于要求严格的AVL树来说,它的旋转次数少,所以对于插入,删除操作较多的情况下,我们就用红黑树
(2)性质
红黑树和AVL树_第1张图片
如图所示,红黑树的特点如下:

  1. 每个节点非红即黑
  2. 如果一个节点是红的,那么它的两儿子都是黑的;
  3. 根节点和叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的;
  4. 对于任意节点而言,其到叶节点NULL指针的每条路径都包含相同数目的黑节点;

(3)应用

  1. 广泛用于C ++的STL中,地图和集都是用红黑树实现的;
  2. IO多路复用的epoll的实现采用红黑树组织管理的的的sockfd,以支持快速的增删改查;

三、红黑树与AVL树区别
1、调整平衡的实现机制不同

红黑树通过颜色变更不超过三次的旋转实现;

AVL根据树的平衡因子(所有节点的左右子树高度差的绝对值不超过1)和旋转决定

2、红黑树的插入效率更高

红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,红黑树并不追求“完全平衡”,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能

而AVL是严格平衡树(高度平衡的二叉搜索树),因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高

3、AVL查找效率高

如果你的应用中,查询的次数远远大于插入和删除,那么选择AVL树,如果查询和插入删除次数几乎差不多,应选择红黑树。即,有时仅为了排序(建立-遍历-删除),不查找或查找次数很少,R-B树合算一些。

你可能感兴趣的:(红黑树,AVL树)