几种常见的树结构

数据结构与算法 专栏收录该内容
2 篇文章 0 订阅


 

1. 二叉树

1.1. 二叉树

二叉树的递归定义为:

  1. 二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;
  2. 左子树和右子树又同样都是二叉树
     
     

1.2. 二叉查找树

对于树中每个节点:

  1. 左子树上所有结点的值均小于或等于它根结点的值。
  2. 右子树上所有结点的值均大于或等于它根结点的值。
  3. 左、右子树也分别为二叉查找树。

查找的时间复杂度

  • 根结点出发,沿某一个路径朝叶子结点前进。因此查找中数据比较次数与树的形态密切相关。
  • 当树中每个结点左右子树高度大致相同时,树高为log2(N)。查找的平均时间复杂度为O(log2(N))。
  • 单支树结构,此时树高n。平均查找长度为(n+1)/2,时间复杂度为O(N)。
     
     

1.3. 平衡二叉树

在符合二叉查找树的条件下,满足任何节点的两个子树的高度最大差为1。

时间复杂度

  • 查找

最坏的情况也是O(log2(N))

  • 插入

插入结点操作最多只需要旋转1次

  • 删除

每一次删除操作最多需要log2(N)次旋转
 
 

2. 红黑树

2.1. 红黑树

红黑树是一种自平衡二叉查找树。
在这里插入图片描述

红黑树特点:

  1. 每个节点不是红色就是黑色的;

  2. 根节点总是黑色的;

  3. 每个叶子节点都是黑色的空节点(NIL节点)。

  4. 每个红色节点的两个子节点都是黑色。也就是说从每个叶子到根的所有路径上不能有两个连续的红色节点。

  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

时间复杂度

  • 查找

最长路径长度不超过最短路径长度的2倍,查找时间复杂度在log2(N)左右,但在最坏情况下(最长路径是最短路径的2倍少1),要比平衡二叉树差一些

  • 插入

插入最多只需要两次旋转

  • 删除

删除最多需要三次旋转
 
 

2.2. 红黑树和平衡二叉树

  • 红黑树和平衡二叉树的搜索时间复杂度都是O(log2(N))
  • 红黑树并不追求完全平衡 ,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
  • 平衡二叉树在删除时最多需要旋转log2(N)次。红黑树在插入或者删除时,任何的不平衡都会在三次旋转之内解决。
  • 涉及到频繁的插入和删除操作,选择红黑树。涉及的插入和删除操作并不频繁,而是查找操作相对更频繁,那么就优先选择平衡二叉树进行实现。
     
     

3. B树

3.1. B树

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树

  1. 根结点至少有两个子女;

  2. 每个非根节点所包含的关键字:至少M/2-1(取上整),至多M-1个

  3. 指向儿子的=指针个数非叶子结点的关键字个数+1;

  4. 所有的叶子结点都位于同一层。

在这里插入图片描述
B树的特性:

  1. 关键字集合分布在整颗树中;

  2. 任何一个关键字出现且只出现在一个结点中;

  3. 搜索有可能在非叶子结点结束;

  4. 其搜索性能等价于在关键字全集内做一次二分查找;
     
     

3.1. B+树

B+树是应文件系统所需而出的一种B树的变型树。
在这里插入图片描述

一棵m阶的B+树和m阶的B-树的差异在于:

  1. 有n棵子树的结点中含有n个关键字。每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点。

  2. 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针。且叶子结点本身依关键字的大小自小而大顺序链接

  3. 所有的非终端结点可以看成是索引部分,结点中仅含其子树(或根结点)中的最大(或最小)关键字。

B+的特性:

  1. 所有关键字都出现在叶子结点的链表中,且链表中的关键字恰好是有序的;

  2. 不可能在非叶子结点查找成功;

  3. 非叶子结点相当于是叶子结点的索引,叶子结点相当于是存储关键字的数据层。
     
     

3.3. B*树

是B+树的变体,在B+树的非根和非叶子结点增加指向兄弟的指针。
在这里插入图片描述
 
 

3.4. B树,B+树与B*树的比较

  1. B树的优势是当要查找的值恰好处在一个非叶子节点时,查找到该节点就会成功并结束查询。而B+树由于非叶节点只是索引部分,这些节点中只含有其子树中的最大(或最小)关键字,当非终端节点上的关键字等于给点值时,查找并不终止,而是继续向下直到叶子节点。因此在B+树中,无论查找成功与否,都是走了一条从根到叶子节点的路径。基于频率的搜索可以选用B树,越频繁query的结点越往根上走。

  2. B+树有一个最大的好处,方便扫库。B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了。

  3. B+树支持区间查询,而B树不支持。这是数据库选用B+树的最主要原因。比如要查 5-10之间的,B+树找到5这个关键字对应存储的数据,再找到10的,然后串起来就行了,B树就非常麻烦。

  4. B+树的分裂方式和B*树的分裂方式不同,B树分配新结点的概率比B+树要低,空间使用率更高;

  • 2
    点赞
  • 2
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

TanaStudy

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值