怎么做赛事直播网站,版面设计网站,广州安全教育平台下载,网站配资公司网站数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树#xff08;二叉排序树、二叉查找树#xff09;#xff0c;平衡二叉树红黑树 B树类型B树#xff08;B-树、B_树#xff09;B树B*树 二叉树
简介
二叉树(Binary Tree) #xff1a;是一种非常重要… 数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树二叉排序树、二叉查找树平衡二叉树红黑树 B树类型B树B-树、B_树B树B*树 二叉树
简介
二叉树(Binary Tree) 是一种非常重要的非线性结构。二叉树是每个节点最多有两个子树的树结构 是n(n0)个结点的有限集合它或者是空树n0或者是由一个根结点及两颗互不相交的、分别称为左子树和右子树的二叉树所组成
节点Node, 二叉树是由N个节点组成每个节点有两个子节点的指针也可以没有分别为左子节点右子节点。
根节点没有父节点的节点就是根节点唯一也就是第一层的哪一个节点。如图所示4
叶子节点没有子节点的节点就是叶子节点。如图所示1357
非叶子节点有子节点的节点就是非叶子节点。如图所示2644 是根节点也是特殊的非叶子节点
度表示节点的子节点个数因为子节点最大数量为2 (左子右子)所以度最大为2.
高度也称树的深度层高等表示树的层级。如图所示树高度为3.
每层节点数量N 2^(h-1) . N每层数量h (层级)。
树总节点数量N (2^h) - 1. N每层数量h (层级)。
如图所示 分类
二叉树也有类别
普通二叉树 平衡二叉树
除最后一层外每一层上的结点数均达到最大值在最后一层上只缺少右边的若干结点
叶子结点只能出现在最下层和次下层。最下层的叶子结点集中在树的左部。倒数第二层若存在叶子结点一定在右部连续位置。如果结点度为1则该结点只有左孩子即没有右子树。同样结点数目的二叉树完全二叉树深度最小 满二叉树
除最后一层无任何子节点外每一层上的所有结点都有两个子结点的二叉树
叶子只能出现在最下一层。出现在其它层就不可能达成平衡。非叶子结点的度(结点拥有的子树数目称为结点的度)一定是2在同样深度的二叉树中满二叉树的结点个数最多叶子数最多 二叉搜索树二叉排序树、二叉查找树
二叉排序树可以为空树或者是具备如下性质若它的左子树不空则左子树上的所有结点的值均小于根节点的值若它的右子树不空则右子树上的所有结点的值均大于根节点的值左右子树分别为二叉排序树。 如下图所示 平衡二叉树
平衡二叉树是一种概念是二叉查找树的一个进化体它有几种实现方式红黑树、AVL树 它是一个空树或它的左右两个子树的高度差的绝对值不超过1并且左右两个子树都是平衡二叉树如果插入或者删除一个节点使得高度之差大于1就要进行节点之间的旋转将二叉树重新维持在一个平衡状态。
这个方案很好的解决了二叉查找树退化成链表的问题把插入查找删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间不过相对二叉查找树来说时间上稳定了很多
AVL实现平衡的关键在于旋转操作 插入和删除可能破坏二叉树的平衡此时需要通过一次或多次树旋转来重新平衡这个树。当插入数据时最多只需要1次旋转(单旋转或双旋转)但是当删除数据时会导致树失衡AVL需要维护从被删除节点到根节点这条路径上所有节点的平衡旋转的量级为O(lgn) 由于旋转的耗时AVL树在删除数据时效率很低在删除操作较多时维护平衡所需的代价可能高于其带来的好处因此AVL实际使用并不广泛 红黑树
红黑树是一种平衡二叉查找树的变体它的左右子树高差有可能大于1所以红黑树不是严格意义上的平衡二叉树AVL但对之进行平衡的代价较低 其平均统计性能要强于 AVL
每个节点或者是黑色或者是红色根节点是黑色每个叶结点是黑色如果一个节点是红色的则它的子节点必须是黑色的红色节点的孩子和父亲都不能是红色。从每个叶子到根的所有路径上不能有两个连续的红色节点任意一结点到每个叶子结点的路径都包含数量相同的黑结点。确保没有一条路径会比其他路径长出俩倍。因而红黑树是相对接近平衡的二叉树并不是一个完美平衡二叉查找树 红黑树和AVL树区别 RB-Tree和AVL树作为二叉搜索树(BBST)其实现的算法时间复杂度相同AVL作为最先提出的BBST貌似RB-tree实现的功能都可以用AVL树是代替那么为什么还需要引入RB-Tree呢
红黑树不追求完全平衡即不像AVL那样要求节点的 高度差的绝对值 1它只要求部分达到平衡但是提出了为节点增加颜色红黑是用非严格的平衡来换取增删节点时候旋转次数的降低任何不平衡都会在三次旋转之内解决而AVL是严格平衡树因此在增加或者删除节点的时候根据不同情况旋转的次数比红黑树要多就插入节点导致树失衡的情况AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance旋转的量级是O(1)删除节点导致失衡AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡旋转的量级为O(logN)而RB-Tree最多只需要旋转3次实现复衡只需O(1)所以说RB-Tree删除节点的rebalance的效率更高开销更小AVL的结构相较于RB-Tree更为平衡插入和删除引起失衡RB-Tree复衡效率更高当然由于AVL高度平衡因此AVL的Search效率更高针对插入和删除节点导致失衡后的rebalance操作红黑树能够提供一个比较便宜的解决方案降低开销是对searchinsert 以及delete效率的折衷总体来说RB-Tree的统计性能高于AVL故引入RB-Tree是功能、性能、空间开销的折中结果 AVL更平衡结构上更加直观时间效能针对读取而言更高维护稍慢空间开销较大。 红黑树读取略逊于AVL维护强于AVL空间开销与AVL类似内容极多时略优于AVL维护优于AVL。
缺点对于数据在内存中的情况红黑树的表现是非常优异的。但是对于数据在磁盘等辅助存储设备中的情况如MySQL等数据库红黑树并不擅长因为红黑树长得还是太高了。当数据在磁盘中时磁盘IO会成为最大的性能瓶颈设计的目标应该是尽量减少IO次数而树的高度越高增删改查所需要的IO次数也越多会严重影响性能
总结实际应用中若搜索的次数远远大于插入和删除那么选择AVL如果搜索插入删除次数几乎差不多应该选择RB-Tree
B树类型
B树B-树、B_树
一种平衡的多叉树称为B树或B-树、B_树Bbalanced说明B树和平衡树有关系 B树是为磁盘等辅存设备设计的多路平衡查找树与二叉树相比B树的每个非叶节点可以有多个子树。 因此当总节点数量相同时B树的高度远远小于AVL树和红黑树(B树是一颗“矮胖子”)磁盘IO次数大大减少。 一棵M阶B树(M阶数表示此树的结点最多有多少个孩子结点(子树))是一棵平衡的m路搜索树。它或者是空树或者是满足下列性质的树
每个节点最多包含 m 个子节点根结点至少有两个子节点除根节点外每个非叶节点至少包含 m/2 个子节点拥有 k 个子节点的非叶节点将包含 k - 1 条记录每个非根节点所包含的关键字个数 j 满足┌m/2┐ - 1 j m - 1除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1故内部子树个数 k 满足┌m/2┐ k m 所有的叶子结点都位于同一层。
简单理解为平衡多叉树为B树每一个子节点上都是有数据的叶子节点之间无指针相邻
B树的搜索从根结点开始如果查询的关键字与结点的关键字相等那么就命中否则如果查询关键字比结点关键字小就进入左儿子如果比结点关键字大就进入右儿子如果左儿子或右儿子的指针为空则报告找不到相应的关键字重复直到所对应的儿子指针为空或已经是叶子结点
如果B树的所有非叶子结点的左右子树的结点数目均保持差不多平衡那么B树的搜索性能逼近二分查找但它比连续内存空间的二分查找的优点是改变B树结构插入与删除结点不需要移动大段的内存数据甚至通常是常数开销但B树在经过多次插入与删除后有可能导致不同的结构
B-树的特性
关键字集合分布在整颗树中任何一个关键字出现且只出现在一个结点中搜索有可能在非叶子结点结束其搜索性能等价于在关键字全集内做一次二分查找自动层次控制
由于M阶B树每个结点最少M/2个结点的限制是为了最大限度的减少查找路径的长度提供查找效率 B树在数据库中有一些应用如mongodb的索引使用了B树结构。但是在很多数据库应用中使用了是B树的变种B树
B树
B树是B树的一种变形形式B树上的叶子结点存储关键字以及相应记录的地址叶子结点以上各层作为索引使用。一棵m阶的B树定义如下
每个结点至多有m个子女除根结点外每个结点至少有[m/2]个子女根结点至少有两个子女有k个子女的结点必有k个关键字
B树的查找与B树不同当索引部分某个结点的关键字与所查的关键字相等时并不停止查找应继续沿着这个关键字左边的指针向下一直查到该关键字所在的叶子结点为止。 B树也是多路平衡查找树其与B树的区别主要在于
B树中每个节点包括叶节点和非叶节点都存储真实的数据B树中只有叶子节点存储真实的数据非叶节点只存储键。 在MySQL中这里所说的真实数据可能是行的全部数据如Innodb的聚簇索引也可能只是行的主键如Innodb的辅助索引或者是行所在的地址如MyIsam的非聚簇索引 点击了解MySQL中索引数据结构分析B树中一条记录只会出现一次不会重复出现而B树的键则可能重复重现——一定会在叶节点出现也可能在非叶节点重复出现。B树的叶节点之间通过双向链表链接B树中的非叶节点记录数比子节点个数少1而B树中记录数与子节点个数相同。
由此B树与B树相比有以下优势
更少的IO次数B树的非叶节点只包含键而不包含真实数据因此每个节点存储的记录个数比B树多很多即阶m更大因此B树的高度更低访问时所需要的IO次数更少。此外由于每个节点存储的记录数更多所以对访问局部性原理的利用更好缓存命中率更高。更适于范围查询在B树中进行范围查询时首先找到要查找的下限然后对B树进行中序遍历直到找到查找的上限而B树的范围查询只需要对链表进行遍历即可。更稳定的查询效率B树的查询时间复杂度在1到树高之间(分别对应记录在根节点和叶节点)而B树的查询复杂度则稳定为树高因为所有数据都在叶节点。
B树也存在劣势由于键会重复出现因此会占用更多的空间。但是与带来的性能优势相比空间劣势往往可以接受因此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树类型总结
二叉搜索树二叉树每个结点只存储一个关键字等于则命中小于走左结点大于走右结点B树(B-树)多路搜索树每个结点存储M/2到MM是指M阶B树个关键字非叶子结点存储指向关键字范围的子结点所有关键字在整颗树中出现且只出现一次非叶子结点可以命中B树在B-树基础上为叶子结点增加链表指针所有关键字都在叶子结点中出现非叶子结点作为叶子结点的索引B树总是到叶子结点才命中B*树在B树基础上为非叶子结点也增加链表指针将结点的最低利用率从1/2提高到2/3