一,AVL树(平衡二叉树)
(1)简介
AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树树高不超过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中的中的实现;
数据结构属于理解一些源码和技术所必备的知识,比如要读懂 Java 语言中 TreeMap 和 TreeSet 的源码就要懂
红黑
树
的数据结构,不然是无法理解源码中关于
红黑
树
数据的操作代码的,比如左旋、右旋、添加和删除操作等。因此本课时我们就来学习一下数据结构的基础知识,方便看懂源码或者是防止面试中被问到。
我们本课时的面试题是,
红黑
树
和
二叉树
有什么
区别
?
要回答这个问题之前,我们先要弄清什么是
二叉树
?什么是
红黑
树
?
二叉树
(Binary Tree)是指每个节点最多只有两个分支的
树
结构,即不存在
今天看了STL源码剖析中关于
红黑
树
的原理和实现,看完复杂的节点插入、节点颜色变换后不禁想:这些功能经典的
AVL
树
也能实现,为什么要提出
红黑
树
?查了些资料,并且加上自己理解,感叹
红黑
树
的巧妙。
首先
红黑
树
是不符合
AVL
树
的
平衡
条件的,即每个节点的左子
树
和右子
树
的高度最多差1的二叉查找
树
。但是提出了为节点增加颜色,
红黑
是用非严格的
平衡
来换取增删节点时候旋转次数的降低,任何不
平衡
都会在三次旋转之内解决
红黑
树
初解
今天来复习一下
红黑
树
的知识点,推荐51CTO这个微信公众号。
学过数据结构都知道
二叉树
的概念,而又有多种比较常见的
二叉树
类型,比如完全
二叉树
、满
二叉树
、二叉搜索
树
、均衡
二叉树
、完美
二叉树
等。
今天我们要说的
红黑
树
就是就是一棵非严格均衡的
二叉树
,均衡
二叉树
又是在二叉搜索
树
的基础上增加了自动维持
平衡
的性质,插入、搜索、删除的效率都比较高。
红黑
树
也是实现 TreeMap 存储结构的基石。
红黑
树
根据节点颜色(同一双亲节点出发到哨兵节点,所有路径上的黑色节点数目一样),一些约定和旋转实现;
AVL
根据
树
的
平衡
因子(所有节点的左右子
树
高度差的绝对值不超过1)和旋转决定
2、
红黑
树
的插入效率更高!!!
红黑
树
是用非严格的
平衡
来换取增删节点时候旋转次数的降低,任何不
平衡
都会在三次旋转之内解决,
红黑
树
并不追求“完全
平衡
”,它只要求部分地达到
平衡
要求,降低...
二叉查找
树
,也称二叉搜索
树
,或二叉排序
树
。其定义也比较简单,要么是一颗空
树
,要么就是具有如下性质的
二叉树
:
(1)若任意节点的左子
树
不空,则左子
树
上所有结点的值均小于它的根结点的值;
(2) 若任意节点的右子
树
不空,则右子
树
上所有结点的值均大于它的根结点的值;
(3) 任意节点的左、右子
树
也分别为二叉查找
树
;
(4) 没有键值相等的节点。
如上图所示,是不同形态...
资源名称:SQLServer中临时表与表变量的
区别
内容简介: 本文档主要讲述的是SQLServer中临时表与表变量的
区别
;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看。资源截图:
资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
RB-Tree和
AVL
树
作为BBST,其实现的算法时间复杂度相同,
AVL
作为最先提出的BBST,貌似RB-tree实现的功能都可以用
AVL
树
是代替,那么为什么还需要引入RB-Tree呢?
红黑
树
不追求"完全平...
如果说
平衡
二叉树
是一个类的话,那么
红黑
树
就是该类的一个实例。
算法的书我丢久了,一下子也找不到,我是凭记忆说的。
红黑
树
的算法比较麻烦,但它的思想很好,如果理解了它的思想也就理解它的算法,我也只记得思想,具体算法记不得了。我就在这说说思想吧。
红黑
树
有两个重要性质:
1、红节点的孩子节点不能是红节点;
2、从根到前端节点的任意一条路径上的黑节点数目一样多。
这两条性质确保该
树
的高度为l