二叉树、二叉搜索树、AVL树、B树、红黑树
在开始之前,我想先说一下自己对于树的拙见:
在树出来之前,就有数组、链表、队列和栈了。它们各自都有比较明显的区别,比如说,数组大小不能改变、链表查询的时间复杂度为O(n)等,因为当前的这些数据结构以及不足以满足越来越高的要求,因此,才会出现树这一数据结构,但是树也随着人们对性能的要求不断的”进化“着:二叉树——> 二叉搜索树——> AVL树 ——> 红黑树,后面才出现的每一个树可能各方面都不是最好的,但是它的综合性能确实比较不错的,你可以将不同的数据结构理解成是在很多性质之间进行取舍而得来的满足某些实际情况的最优解
说完了这么多,接下来我们来讲讲这些数是什么样的:
需要注意的是,在讲之前,我是默认大家理解有关树的相关概念的,比如:节点、左右子树、树高、度等等
一、二叉树(Binary Tree)
二叉树中性质最简单的了,可以说,下面将要说的所有的数都是二叉树。因此前序遍历、中序遍历和后续遍历都适用于所有的树
-
示例
-
性质
顾名思义就是指
每个节点最多由两个子节点
或者说任意一个节点的度最多为2
-
优缺点
因为存储的时候没有规律,所以查找某个元素的时候狙需要进行遍历(时间复杂度为O(n)),此种情况下和链表是差别不大的
二、二叉搜索树(Binary Search Tree)
它继承了二叉树的性质,并且有着自己独有的性质,目的是为了方便搜索某个元素,这一点从名字也可以看出来
- 示例
-
性质
每个节点与其左右子节点都按照某个特定的规则进行排列
(上面的示例是每个节点上的数大于左孩子并且小于右孩子,因此树下方锁对应的中序遍历结果是一个从小到大排好序的)
-
优缺点
明显的优点是搜索效率高,并且搜索次数由树高决定,因此时间复杂度为O(log(n)),其前序遍历和后续遍历的结果是有序的
缺点是树的高度可能会很高也可能会很矮,是不可控的,因此某些情况下可能会退化成链表,比如数据添加的顺序是: 1 2 3 4 5 6 7 8 9这样顺序添加
三、AVL树
它继承了二叉搜索树的性质,名字是由其发明者们的名字组合而成,它还有另一个名字——自平衡二叉搜索树
,它解决了二叉搜索树高度不可控而退化成链表的问题
-
示例
-
性质
每个节点左右子树的高度之差的最大值为1
-
优缺点
优点是能够使插入的数据所构成的树的高度不会变得很高,从而使查询的速度可以非常之快,查询的时间复杂度为O(log(n))
缺点是为了保证左右子树高度差不超过1,所以在每次增删节点后,都需要节点之间进行旋转操作,这一操作可能会递归到根节点,从而导致要进行log(n)次的旋转。
四、4阶B树
为什么要说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树的时候再来说