1 链表

1.1 定义

链表【Linked List】:链表是由一组不必相连(不必相连:可以连续也可以不连续)的内存结构(节点),按特定的顺序链接在一起的抽象数据类型。


链表是离散存储线性结构

n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。


1.1.1 补充

抽象数据类型(Abstract Data Type【ADT】):表示数学中抽象出来的一些操作的集合。

内存结构:内存中的结构,如:struct、特殊内存块…等等之类;

1.1.2 数组和链表的区别和优缺点

数组是一种连续存储线性结构,元素类型相同,大小相等

数组的优点:

存取速度快

数组的缺点:

事先必须知道数组的长度

插入删除元素很慢

空间通常是有限制的

需要大块连续的内存块

插入删除元素的效率很低


链表优点:

空间没有限制插入删除元素很快

链表缺点:

存取速度很慢

1.2 链表分类

链表常用的有 3 类: 单链表、双向链表、循环链表。

java 数据结构总结 java数据结构知识点_数据结构

链表的核心操作集有 3 种:插入、删除、查找(遍历)

1.2.1 单链表

单链表 [Linked List]:由各个内存结构通过一个 Next 指针链接在一起组成,每一个内存结构都存在后继内存结构(链尾除外),内存结构由数据域和 Next 指针域组成。

单链表实现图示:

java 数据结构总结 java数据结构知识点_链表_02

解析:

  • Data 数据 + Next 指针,组成一个单链表的内存结构 ;
  • 第一个内存结构称为 链头,最后一个内存结构称为 链尾;
  • 链尾的 Next 指针设置为 NULL [指向空];
  • 单链表的遍历方向单一(只能从链头一直遍历到链尾)

单链表操作集:

java 数据结构总结 java数据结构知识点_数据结构_03

1.2.2 双向链表

双向链表 [Double Linked List]:由各个内存结构通过指针 Next 和指针 Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构(链头没有前驱,链尾没有后继),内存结构由数据域、Prev 指针域和 Next 指针域组成。

双向链表实现图示:

java 数据结构总结 java数据结构知识点_java 数据结构总结_04

解析:

  • 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 指针域组成。

循环链表的单向与双向实现图示:

java 数据结构总结 java数据结构知识点_java 数据结构总结_05

解析:

  • 循环链表分为单向、双向两种;
  • 单向的实现就是在单链表的基础上,把链尾的 Next 指针直接指向链头,形成一个闭环;
  • 双向的实现就是在双向链表的基础上,把链尾的 Next 指针指向链头,再把链头的 Prev指针指向链尾,形成一个闭环;
  • 循环链表没有链头和链尾的说法,因为是闭环的,所以每一个内存结构都可以充当链头

和链尾;

循环链表操作集:

java 数据结构总结 java数据结构知识点_java 数据结构总结_06

2 二叉树

2.1 定义

二叉树是树的一种,每个节点最多可具有两个子树,即结点度最大为2 (结点度:结点拥有的子树数)。

例:

java 数据结构总结 java数据结构知识点_链表_07

二叉树就是每个节点不能多于有两个儿子,上面的图就是一颗二叉树而且还是一种特殊的二叉树:二叉查找树(binary search tree)。


定义:当前根节点的左边全部比根节点小,当前根节点的右边全部比根节点大。可以看出,这对我们来找一个数是非常方便快捷的。


2.2 二叉树的种类

2.2.1 斜树

所有结点都只有左子树,或者右子树。

java 数据结构总结 java数据结构知识点_指针_08

2.2.2 满二叉树

所有的分支节点都具有左右节点。

java 数据结构总结 java数据结构知识点_数据结构_09

2.2.3 完全二叉树

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h

层所有的结点都连续集中在最左边,这就是完全二叉树。

java 数据结构总结 java数据结构知识点_二叉树_10

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 二叉树的遍历方式

二叉树的遍历方式,一般分为先序遍历,中序遍历,后序遍历。

  • 先序遍历
  • 先访问根节点,然后访问左节点,最后访问右节点(根->左->右)
  • 中序遍历
  • 先访问左节点,然后访问根节点,最后访问右节点(左->根->右)
  • 后序遍历
  • 先访问左节点,然后访问右节点,最后访问根节点(左->右->根)