二叉树、二叉搜索树、AVL树、B树、红黑树 在开始之前,我想先说一下自己对于树的拙见:
? 在树出来之前,就有数组、链表、队列和栈了。它们各自都有比较明显的区别,比如说,数组大小不能改变、链表查询的时间复杂度为O(n)等,因为当前的这些数据结构以及不足以满足越来越高的要求,因此,才会出现树这一数据结构,但是树也随着人们对性能的要求不断的”进化“着:二叉树——> 二叉搜索树——> AVL树 ——> 红黑树,后面才出现的每一个树可能各方面都不是最好的,但是它的综合性能确实比较不错的,你可以将不同的数据结构理解成是在很多性质之间进行取舍而得来的满足某些实际情况的最优解
说完了这么多,接下来我们来讲讲这些数是什么样的:
需要注意的是,在讲之前,我是默认大家理解有关树的相关概念的,比如:节点、左右子树、树高、度等等
一、二叉树(Binary Tree)
? 二叉树中性质最简单的了,可以说,下面将要说的所有的数都是二叉树。因此前序遍历、中序遍历和后续遍历都适用于所有的树
- 示例
文章图片
- 性质
顾名思义就是指每个节点最多由两个子节点
或者说任意一个节点的度最多为2
- 优缺点
因为存储的时候没有规律,所以查找某个元素的时候狙需要进行遍历(时间复杂度为O(n)),此种情况下和链表是差别不大的
? 它继承了二叉树的性质,并且有着自己独有的性质,目的是为了方便搜索某个元素,这一点从名字也可以看出来
- 示例
文章图片
- 性质
每个节点与其左右子节点都按照某个特定的规则进行排列
(上面的示例是每个节点上的数大于左孩子并且小于右孩子,因此树下方锁对应的中序遍历结果是一个从小到大排好序的)
- 优缺点
明显的优点是搜索效率高,并且搜索次数由树高决定,因此时间复杂度为O(log(n)),其前序遍历和后续遍历的结果是有序的
缺点是树的高度可能会很高也可能会很矮,是不可控的,因此某些情况下可能会退化成链表,比如数据添加的顺序是: 1 2 3 4 5 6 7 8 9这样顺序添加
? 它继承了二叉搜索树的性质,名字是由其发明者们的名字组合而成,它还有另一个名字——
自平衡二叉搜索树
,它解决了二叉搜索树高度不可控而退化成链表的问题- 示例
?
文章图片
- 性质
每个节点左右子树的高度之差的最大值为1
- 优缺点
优点是能够使插入的数据所构成的树的高度不会变得很高,从而使查询的速度可以非常之快,查询的时间复杂度为O(log(n))
缺点是为了保证左右子树高度差不超过1,所以在每次增删节点后,都需要节点之间进行旋转操作,这一操作可能会递归到根节点,从而导致要进行log(n)次的旋转。
? 为什么要说4阶B树呢?其实呀,这是为接下来的红黑树做铺垫,避免看到红黑树就会觉得懵。说回正题,B数继承了二叉搜索树的性质,即前序遍历和后续遍历的结果是有序的,它将树的高度压缩得比AVL树还要低
- 示例(4阶B树)
文章图片
- 性质
对于一个n阶B树(n>=2):
- 根节点元素个数的取值范围是[1 , n-1] ,即4阶B树根节点元素个数取值范围是[1 , 3]
- 非根节点元素个数在[ ceiling(n/2)-1 , floor(n-1) ]范围内s(ceiling表示向上取整,floor表示向下取整),即4阶B树的非根节点元素个数的取值范围是[1 , 3]
- 设每个节点的元素个数为 x 个,那么起子节点的个数则为x + 1个
- 优缺点
给人最直观的特点就是非常的矮!
B树的具体的优缺点这里先不展开来讲了,等看到后面的B树的时候再来说
红黑树属于平衡二叉搜索树,估计在很多人眼里是属于树种比较高大尚的了,为什么呢?归其原因,是因为它的功能很强大,很多技术底层使用了红黑树,就比如说的HashMap,当桶内链表的长度超过8的时候,会转换成红黑树 。并且,红黑树这一数据结构在Java中并没有对应的类。对于红黑树你可以把它理解为是AVL树的升级版,在说这个之前,首先回顾一下AVL存在的问题:由于维护平衡性(即任何一个节点的子树的高度差不能大于1),在每次插入或者删除新节点的时候都需要进行旋转操作以保持平衡,这个操作是递归的,可能从最下面一直传到根节点,如果树的规模越大,耗费的时间也就越多。在知道了AVL树存在的问题后,我们来看看红黑树,因为红黑树的如下性质,让其任意一个节点的两颗子树的长度差不超过二,虽然和AVL树比起来,平衡性没有那么好,但是在进行节点增删的时候节省了为维护性质而花费的成本(即大大减少了旋转次数)。
- 示例
文章图片
- 性质
- 节点必须是 红色的 或者 黑色的
- 根节点是黑色的
- 叶子节点(空节点)都是黑色的
- 红色节点的子节点都是黑色的
红色节点的父节点都是黑色的
从根节点到叶子节点的任意一条路径都不能有2个连续的红色节点 - 任意节点到叶子节点所有的路径都包含相同数目的黑色节点
- 优缺点
优点是它相对于AVL树,减少了因为旋转而花费的成本,因此性能要比AVL树好
推荐阅读
- 数据结构与算法|一看就懂的二叉查找树和平衡二叉查找树
- 人工智能|用PaddlePaddle打比赛!
- 算法|我蚌埠住了,2000页算法LeetCode刷题笔记,对标字节跳动面试难度
- java|冷知识(数据结构如何造就Redis的快())
- 一起刷好题|《二叉树刷题计划》——平衡二叉树
- 動態規劃|1130. Minimum Cost Tree From Leaf Values(DP)
- Java数据结构|《Java数据结构》二叉树的这些基本操作你真的理解了吗
- 动态规划|115、完全背包-LeetCode-139.单词拆分
- 大数据|大模型炼丹无从下手(谷歌、OpenAI烧了几百万刀,总结出这些方法论…)