AVL树(高度平衡二叉搜索树)与红黑树(R-D)的区别

一、AVL树

AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树树高不超过1,和红黑树相比,AVL是严格的平衡二叉树,平衡条件必须满足所有节点左右子树高度不超过1

不管我们执行插入还是删除操作,只要不满足上述条件,就要通过旋转来保持平衡,而且因为旋转非常耗时,因此我们知道AVL平衡树适用于插入、删除比较少的情况,查找比较多的情况

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

二、红黑树

一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)

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

性质

                   AVL树(高度平衡二叉搜索树)与红黑树(R-D)的区别_第1张图片

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

1、每个节点非红即黑

2、根节点是黑色

3、每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的。

4、如图所示,如果一个节点是红的,那么它的两个儿子都是黑的。

5、对于任意节点而言,其到叶子节点树NULL指针的每条路径都包含相同数目的黑节点。

6、每条路径都包含相同的黑节点。

3、应用

(1)广泛应用于C++的STL中,地图和集都是用红黑树实现的。

(2)LINUX的进程调度完全公平调度程序,用红黑树管理进程控制块,进程的虚拟内存区域都存储在一棵红黑树上,每个虚拟地址区域都对应红黑树的一个节点,左指针指向相邻的地址虚拟存储区域,右指针指向相邻的高地址虚拟地址空间。

(3)IO多路复用的epoll的实现采用红黑树组织管理的sockfd,以支持快速的增删改查。

(4)Nginx(Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。)中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前

最小的定时器。

(5)Java TreeMap红黑树实现。(TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。)TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

你可能感兴趣的:(AVL树(高度平衡二叉搜索树)与红黑树(R-D)的区别)