二叉树各种类型汇总

如题所述

第1个回答  2022-07-15
学习了树的结构类型后,主要对各种树类型进行汇总总结

树中的基本概念: https://jingzh.blog.csdn.net/article/details/107128291
树类型概述:
二叉树,完全二叉树,满二叉树,二叉排序树,平衡二叉树,红黑树,B树,B+树,B*树

二叉树:二叉树是每个节点最多有两个子树的树结构;
是 n(n>=0) 个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两颗互不相交的、分别称为左子树和右子树的二叉树所组成

二叉树特点:

完全二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点

完全二叉树特点:

除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树

满二叉树特点:

二叉排序树:可以为空树,或者是具备如下性质:若它的左子树不空,则左子树上的所有结点的值均小于根节点的值;若它的右子树不空,则右子树上的所有结点的值均大于根节点的值,左右子树分别为二叉排序树。
如下图所示:

平衡二叉树是一种概念,是二叉查找树的一个进化体,它有几种实现方式: 红黑树 、 AVL树
它是一个空树或它的左右两个子树的 高度差的绝对值不超过1 ,并且左右两个子树都是平衡二叉树,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。

这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉 O(logN) 左右的时间,不过相对二叉查找树来说,时间上稳定了很多

红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能 大于1 ,所以红黑树不是严格意义上的平衡二叉树( AVL ),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL

红黑树和 AVL 树区别
RB-Tree 和 AVL 树作为二叉搜索树( BBST ),其实现的算法时间复杂度相同, AVL 作为最先提出的 BBST ,貌似 RB-tree 实现的功能都可以用 AVL 树是代替,那么为什么还需要引入 RB-Tree 呢

总结:实际应用中,若搜索的次数远远大于插入和删除,那么选择 AVL ,如果搜索,插入删除次数几乎差不多,应该选择 RB-Tree

一种平衡的 多叉树 ,称为 B树 (或 B-树 、 B_树 , B:balanced 说明B树和平衡树有关系)

简单理解为:平衡多叉树为B树(每一个子节点上都是有数据的),叶子节点之间无指针相邻

B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;重复,直到所对应的儿子指针为空,或已经是叶子结点

如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;但B树在经过多次插入与删除后,有可能导致不同的结构

B-树的特性:

由于M阶B树每个结点最少M/2个结点的限制,是为了最大限度的减少查找路径的长度,提供查找效率

B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下

B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。

B*树 是 B+树 的变体,在 B+树 的非根和非叶子结点再增加指向兄弟的指针;
B*树 定义了非叶子结点关键字个数至少为 (2/3)*M ,即块的最低使用率为 2/3 (代替B+树的1/2);

B+树 的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针; B+树 的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

B*树 的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;所以, B*树 分配新结点的概率比 B+树 要低,空间使用率更高

B树 类型总结:
相似回答