这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
1. 前言
看过圣诞树吗,在数据结构中,树就是一个像树的数据结构,是不是有点绕口,没关系,下面详细介绍一下树
在开始之前说一下必须要掌握的概念
小知识:一个节点最多有两个子节点,它的边数一定等于 节点数 - 1 ,树不会包含回路
- 节点:树中的每个元素都可以称之为节点,上图的每个圆圈都是一个节点
- 根节点:树顶的那个节点,上图 A 就是根节点
- 父节点:顾名思义,爸爸节点,比如上图 A 节点就是 B 和 C 的爸爸
- 子节点:跟爸爸节点反过来,上图的 B 和 C 就是 A 的子节点
- 叶子结点:没有子节点的节点,上图的 DHFI 都是叶子结点
- 节点的高度:该节点到叶子结点的最长路径所包含的连线有多少条
- 节点的深度:根节点到该节点的连线有多少条
- 节点的层数:节点的深度 + 1
- 树的高度:根节点到最远的叶子结点的连线有多少条
本文主要介绍一下二叉树的分类以及存储的方式
2. 二叉树的分类
二叉树分为好几种
- 满二叉树
- 完全二叉树
- 平衡二叉树
基于这三种又衍生出 B 树,B+树等等
1.1满二叉树
如果一个二叉树,每一层的节点数都达到最大值,则这个二叉树就是满二叉树
1.2 完全二叉树
除了最后一层,其余层都是满的二叉树;最后一层可以是满的,也可以是缺少连续个数的节点;满足前面两个条件的树可以成为二叉树
怎么理解呢?
可以想象为一棵树从根结点开始扩展,扩展完左子节点才能开始扩展右子节点,每扩展完一层,才能继续扩展下一层;完全二叉树有很好的规律性
1.3 平衡二叉树
平衡二叉树的常用实现方法有 红黑树、AVL 树、替罪羊树、加权平衡树、伸展树 等
二叉树相比于链表,由于父子节点以及兄弟节点之间往往具有某种特殊的关系,这种关系使得我们在树中对数据进行搜索和修改时,相对于链表更加快捷便利
但是,如果二叉树退化为一个链表了,那么那么树所具有的优秀性质就难以表现出来,效率也会大打折,为了避免这样的情况,我们希望每个父结点,都有儿子,分给左儿子和分给右儿子的尽可能一样多,相差最多不超过一层,这就是平衡二叉树
3. 二叉树的存储
3.1 链式存储
二叉树的链式存储依靠每个节点去记录下个节点的所在地的指针,所以并不需要连续的内存空间
每个节点又分为 数据、左节点指针和右节点指针,在 Java 中,左右指针记录的是引用对象,是不是有点熟悉,像链表的感觉
3.2 顺序存储
顺序存储就是利用数组进行存储,数组中的每一个位置仅存储节点的 data,不存储左右子节点的指针,子节点的索引通过数组下标完成,就像这样:
4. 总结
算是二叉树的先导篇,希望看完的你能对二叉树有个了解,后续出更深层的解读