1 链表
1.1 定义
链表【Linked List】:链表是由一组不必相连(不必相连:可以连续也可以不连续)的内存结构(节点),按特定的顺序链接在一起的抽象数据类型。
链表是离散存储线性结构
n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。
1.1.1 补充
抽象数据类型(Abstract Data Type【ADT】):表示数学中抽象出来的一些操作的集合。
内存结构:内存中的结构,如:struct、特殊内存块…等等之类;
1.1.2 数组和链表的区别和优缺点
数组是一种连续存储线性结构,元素类型相同,大小相等
数组的优点:
存取速度快
数组的缺点:
事先必须知道数组的长度
插入删除元素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低
链表优点:
空间没有限制插入删除元素很快
链表缺点:
存取速度很慢
1.2 链表分类
链表常用的有 3 类: 单链表、双向链表、循环链表。
链表的核心操作集有 3 种:插入、删除、查找(遍历)
1.2.1 单链表
单链表 [Linked List]:由各个内存结构通过一个 Next 指针链接在一起组成,每一个内存结构都存在后继内存结构(链尾除外),内存结构由数据域和 Next 指针域组成。
单链表实现图示:
解析:
- Data 数据 + Next 指针,组成一个单链表的内存结构 ;
- 第一个内存结构称为 链头,最后一个内存结构称为 链尾;
- 链尾的 Next 指针设置为 NULL [指向空];
- 单链表的遍历方向单一(只能从链头一直遍历到链尾)
单链表操作集:
1.2.2 双向链表
双向链表 [Double Linked List]:由各个内存结构通过指针 Next 和指针 Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构(链头没有前驱,链尾没有后继),内存结构由数据域、Prev 指针域和 Next 指针域组成。
双向链表实现图示:
解析:
- Data 数据 + Next 指针 + Prev 指针,组成一个双向链表的内存结构;
- 第一个内存结构称为 链头,最后一个内存结构称为 链尾;
- 链头的 Prev 指针设置为 NULL, 链尾的 Next 指针设置为 NULL;
- Prev 指向的内存结构称为 前驱, Next 指向的内存结构称为 后继;
- 双向链表的遍历是双向的,即如果把从链头的 Next 一直到链尾的[NULL] 遍历方向定义为正向,那么从链尾的 Prev 一直到链头 [NULL ]遍历方向就是反向;
双向链表操作集:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3Z6zTDB-1597991727112)(Java集合框架常用数据结构.assets/29184)]
1.2.3 循环链表
单向循环链表 [Circular Linked List] : 由各个内存结构通过一个指针 Next 链接在一起组成,每一个内存结构都存在后继内存结构,内存结构由数据域和 Next 指针域组成。
双向循环链表 [Double Circular Linked List] : 由各个内存结构通过指针 Next 和指针Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构,内存结构由数据域、Prev 指针域和 Next 指针域组成。
循环链表的单向与双向实现图示:
解析:
- 循环链表分为单向、双向两种;
- 单向的实现就是在单链表的基础上,把链尾的 Next 指针直接指向链头,形成一个闭环;
- 双向的实现就是在双向链表的基础上,把链尾的 Next 指针指向链头,再把链头的 Prev指针指向链尾,形成一个闭环;
- 循环链表没有链头和链尾的说法,因为是闭环的,所以每一个内存结构都可以充当链头
和链尾;
循环链表操作集:
2 二叉树
2.1 定义
二叉树是树的一种,每个节点最多可具有两个子树,即结点度最大为2 (结点度:结点拥有的子树数)。
例:
二叉树就是每个节点不能多于有两个儿子,上面的图就是一颗二叉树而且还是一种特殊的二叉树:二叉查找树(binary search tree)。
定义:当前根节点的左边全部比根节点小,当前根节点的右边全部比根节点大。可以看出,这对我们来找一个数是非常方便快捷的。
2.2 二叉树的种类
2.2.1 斜树
所有结点都只有左子树,或者右子树。
2.2.2 满二叉树
所有的分支节点都具有左右节点。
2.2.3 完全二叉树
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h
层所有的结点都连续集中在最左边,这就是完全二叉树。
2.2.4 二叉树的性质
- 二叉树第i 层上的结点数目最多为 2^(i-1) (i≥1)
- 深度为h 的二叉树至多有2^h-1 个结点(h≥1)
- 包含n 个结点的二叉树的高度至少为log2 (n+1)
- 在任意一棵二叉树中,若终端结点的个数为n0,度为2 的结点数为n2,则n0=n2+1
2.2.5 二叉树的遍历方式
二叉树的遍历方式,一般分为先序遍历,中序遍历,后序遍历。
- 先序遍历
- 先访问根节点,然后访问左节点,最后访问右节点(根->左->右)
- 中序遍历
- 先访问左节点,然后访问根节点,最后访问右节点(左->根->右)
- 后序遍历
- 先访问左节点,然后访问右节点,最后访问根节点(左->右->根)