add by zhj: AVL树和红黑树都是平衡二叉树,虽然AVL树是最早发明的平衡二叉树,但直接把平衡二叉树等价于AVL树,我认为非常不合适。

但很多地方都在这么用。两者的比较如下

平衡二叉树类型 平衡度 调整频率 适用场景
AVL树 查询多,增/删少
红黑树 增/删频繁

原文:https://blog.csdn.net/u010899985/article/details/80981053

一,AVL树

(1)简介

一般用平衡因子判断是否平衡并通过旋转来实现平衡,左右子树树高不超过1,和红黑树相比,AVL树是高度平衡的二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而的由于旋转比较耗时,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况

(2)局限性

由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树。

(3)应用

1,Windows NT内核中广泛存在;

二、红黑树

(1)简介

也是一种平衡二叉树,但每个节点有一个存储位表示节点的颜色,可以是红或黑。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度<=红黑树),相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,用红黑树。

(2)性质

如图1所示,每个节点非红即黑;

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

(3)应用

1. 广泛用于C ++的STL中,地图是用红黑树实现的;
2. Linux的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;
3. IO多路复用的epoll采用红黑树组织管理sockfd,以支持快速的增删改查;
4. Nginx中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;
5. Java的TreeMap的实现;

最新文章

  1. 背压(Backpressure)机制
  2. SAP SD 销售凭证如何设置字段必填
  3. gruntJs篇之connect+watch自动刷新
  4. 逗号分隔的字符串转换为行数据(collection)
  5. 【转】推荐UML插件AmaterasUML
  6. (转)system()函数
  7. ASP.NET过滤器、URL重写
  8. POJ1505 Copying Books(二分法)
  9. void (*fun)(void);
  10. C和Java中数组的定义
  11. HDU2571 命运 动态规划
  12. 3016: [Usaco2012 Nov]Clumsy Cows
  13. RGB与HSV之间的转换公式及颜色表
  14. java基于BasicPlayer调用 播放音乐
  15. jquery for循环
  16. SVG路径path的贝塞尔曲线指令
  17. javascript 4.1 美术馆
  18. java Name [jdbc/myjavadb] is not bound in this Context. Unable to find [jdbc].
  19. xml文件里 用js语句获取 当前时间
  20. Lua之math

热门文章

  1. .NET Core 下调用WebAPI
  2. jquery添加插件
  3. (原)netbeans中使用libtorch
  4. Python从零开始——运算符
  5. docker 网络模式 和 端口映射
  6. 3. 卷积神经网络(CNN)
  7. U-Boot的常用命令详解
  8. gradle应用
  9. selenium 动态元素的定位
  10. Pandas | 07 函数应用