搜索树 总结

 

二叉排序树(Binary Sort Tree)又称二叉搜索树。

它要么是一棵空树,要么是一棵具有下列性质的二叉树:

1)若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;

2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3)它的左、右子树也分别为二叉排序树;

 

二叉排序树的检索效率与顺序查找中二分查找的效率近似,二分查找适用于静态查找表,而二叉排序树适合于动态查找表;

对于含有 n个结点的二叉排序树,在最好情况下,其深度不超过log(2(n)),查找次数为【log2(n)】+1,其中【x】为不超过x的最大整数,查找的时间复杂度为O(log2(n))。等同于二分查找

在最差情况下,退化为一棵 斜树,进而使得查找的时间复杂度为 O(n)等同于顺序查找。

 

【注意】

1、二叉搜索树的中序遍历是一个 有序 序列(将搜索二叉树转化成双向链表也是利用二叉树的中序遍历)。也即:根据节点值大小排序所需时间复杂度是线性的。

2、二叉搜索树的最小值仅需一直往左走,而最大值仅需一直往右走;

对于搜索树来说,只要知道前序遍历就能还原了,第一个是根结点,之后的连续K个小于根节点的为左子树,后面的都是右子树,然后递归;

【例题1】
已知序列(50,30,80,20,40,90,35,85,32,88) ,按照依次插入的方法生成二叉排序树,
则在该树中查找关键字值为35的结点需比较__4__次,,正好是在树中的层数。

方法一:画树的图:

方法二:方法二:将序列从小到大排序,按二分查找寻找次数(3 2 3 4 1 3 4 2 3 4)。

【例题2】
给定N个节点,能构成多少种不同的二叉搜索树?

解析:使用卡兰特数:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796,
其递推式为:h(n) = h(0)h(n-1) + h(1)h(n-2) + ... + h(n - 1)h(0)

 

平衡二叉排序树又称AVL树是一种二叉排序树

它具有以下的性质:

它要么是一颗空树,要么它的左右两个子树的高/深度差的绝对值不超过1,并且左右两个子都是平衡二叉树。

既然是平衡树,它解决了二叉排序树存在 斜树 的问题,AVL树查找、插入、删除的时间复杂度为O(logN)

 

将二叉树的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor),那么平衡二叉树上所有结点的平衡因子只能 -1、0和1三选一,否则就不是平衡二叉树。插入结点后不改变原二叉树的平衡性,至少一个节点的平衡因子会改变。

图3不是平衡二又树的原因就在于,结点58的左子树高度为2,而右子树为空,二者差大于了绝对值1,因此它也不是平衡的。

距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树(是不平衡的二叉树),我们称为最小不平衡子树。对图3来说,当新插入结点37时,距离它最近的平衡因子绝对值超过1(即它的左子树高度2减去右子树高度0,它的BF = 2 > 1)的结点是58,所以从58开始以下的子树为最小不平衡子树。

AVL失衡后的调整
将最小不平衡子树进行按照 BF进行适当的旋转可得到平二叉树,具体的 AVL失衡后再平衡的 转规则 如下:
1、若BF 为大于 1,将最小不平衡子树进行 右旋 (顺时针旋转);( LL型旋转)
2、 若BF 为小于-1,将最小不平衡子树进行 左旋 (逆时针旋转);(亦 RR型旋转)
3、若 插入结点后,最小不平衡子树的BF与它的子树的BF符号相反时,就需要对结点先进行一次旋转以使得符号相同后, 再反向旋转一次才能够完成平衡操作, (亦 称L R型/RL型旋转)
 
应用:
windows对进程地址空间的管理用到了AVL树。最小二叉平衡树的节点总数的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。(类似斐波拉契数列)

 

红黑树

红黑树是一种平衡二叉排序树,它的每个节点都带有颜色(红色或黑色)属性,除了二叉排序树的的性质外,还增加了如下的额外要求:

  • 性质1、每个节点非红即黑;

  • 性质2、根节点是黑色;

  • 性质3、每个叶子节点是黑色的空节点;

  • 性质4、每个红色节点的两个子节点都是黑色;

  • 性质5、从任一节点到其每个叶子的所有路径都包含相的黑色节点;

性质4,可知:新增的父节点必须是黑

性质5,可知:新增的子节点必须是红;可知:若一结点存在黑的子节点,那此节点有两个子节点;

红黑树能够以O(log n)的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决。这一点是AVL所不具备的。红黑树广泛用在C++的STL中。map、multimap和set、multiset的底层都是用红黑树实现的。而unordered_map底层实现是hash。

红黑树的调整

1、左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变

2、右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变

3、变色:结点的颜色由红变黑或由黑变红。

【注】左右旋只属于局部调整,若要保持红黑树的性质,还得靠变色;其中红黑树节点的插入、删除;涉及的子情况较多,交复杂,先留着,,后面再补上。。。

 

多路查找树

多路查找树其每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素。

根据孩子数目来命名树的类型,因此孩子的数目多少是十分关键的,常见的有2-3树、2-3-4树、B树、B+树。

结点最大的孩子数目称为B树的阶(order),即最多有多少个孩子结点。2-3树和2-3-4树都是B树的特例。

B树(B-tree)

又称B-树是一种平衡的多路查找树。一棵平衡的m阶B树,它要么是一棵空树,要么具有如下属性:

1、如果根结点不是叶结点,则其至少有两棵子树。

2、每一个非根的分支结点都有 k-1个元素和 k个孩子,每一个叶子结点n都有 k-1个元素,其中【m/2】<= k <= m。【x】为不超过x的最大整数;

3、所有叶子结点都位于同一层次。

4、所有分支结点包含下列信息数据(n,  A0,  K1, A1, K2, A2 … ,Kn, An)其中:

n为关键字的个数(或n+1为子树的个数),(其中【m/2】- 1<= n ≤ m-1)

Ki( i = 1, 2, ...., n)为关键字,且Ki < Ki+1( i = 1, 2, ...., n-1);

Ai( i = 0, 2, ...., n)为指向子树根结点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki(i=1,2..n),An所指子树中所有结点的关键字均大于Kn,

(常使用在内存外存数据交互时,访问外部文件数据量极高)B树只支持随机搜索,且搜索、插入的时间复杂度为O(log N)

m阶B树中含有n个关键字的最大深度不超过log【m/2】{(n+1)/2} + 1  解释:【x】为不超过x的最大整数,在式中做底数,{}内为幂 ,再加1;

 

B+树(B+tree)

B+树是应文件系统(数据库、Ext3FS等等文件系统)所需而提出的一种 B树 的变形树,m阶B+树的结构定义如下:

1、若根节点不是叶子节点且非空,则至少有两个子树;

2、除根节点之外每个结点至少有【m/2】棵子树;

3、树中每个节点至多有m棵子树;

4、有 K个孩子的节点(分支节点)必有 K个关键码;

B+ 树支持随机搜索和顺序搜索

B+树特点

1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,
所以每次查找的次数都相同所以查询速度要比B树更稳定;
3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,
在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,
而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

 

B树、B+树差异

B+树的话,有n棵子树的结点中包含有n个关键字;所有的叶子结点包含全部关键字的信息,
及指向含这些关键字记录的指针,叶子结点本身依关键字的大小自小而大顺序链接;
和B树不同,B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,
这样使得B+树每个非叶子节点所能保存的关键字大大增加。
和B树不同,B+树叶子节点保存了父节点的所有关键字记录的指针,
所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
和B树不同,B+树叶子节点的关键字从小到大有序排列,
左边结尾数据都会保存右边节点开始数据的指针。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值