java八股复习指南-数据结构篇
线性存储结构
数组
特点:
容量有限;长度固定;提供随机访问
链表
特点:
内存动态管理;但由于存放节点,会占用更多的空间;不提供随机访问
栈
特点:
只允许在一端进行加入(push)数据和移除(pop)数据,按照后进先出的原理进行,push和pop操作均在栈顶进行
队列
特点:
只允许在尾部(rear)加入数据(入队),在头部(front)移除数据(出队)。按照先进先出的原理进行。
图
简单来说,图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。
图的存储
邻接矩阵
简单直接、获取顶点之间的关系效率高效、浪费存储空间
邻接表
使用链表存储每个顶点的所有后继相邻顶点。
图的搜索
广度优先搜索
使用队列:
- 将要搜索的源节点放入队列
- 取出队首节点,将该节点所有后继节点(未访问)加入队列,依次进行直到队列为空
深度优先搜索
使用栈:
- 将要搜索的源节点放入队列
- 取出栈顶元素,将所有后继节点(未访问)放入栈,依次进行直到栈为空
树
分类
满二叉树
每一层结点数达到最大值
完全二叉树
除最后一层外,其余层都是满的,并且最后一层只有右侧有若干缺失的节点。
特点是:父结点与子结点序号存在对应关系,因此可以利用数组存储,最大节省空间
平衡二叉树
左右子树相差最多不超过一层
存储方式
链式存储
与链表类似,每个结点通过左右指针指向左右结点
顺序存储
适用于完全二叉树
遍历方式
先序遍历
根左右
中序遍历
左根右
后序遍历
左右根
堆
堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。分最大堆、最小堆,类似三角形、倒三角形。
通常用完全二叉树表示
堆的操作
插入元素,以最大堆
- 将插入元素放到队列最后
- 与父结点比较大小,如果大,则与父结点交换位置
删除堆顶元素
删除堆顶元素,将队列末尾的元素放在堆顶,然后自顶向下进行堆化
堆排序
分为两步:
- 建堆:将一个无序的数组建立为一个堆。具体做法是:对非叶子结点进行堆化(自顶向下)
为什么只用堆化非叶子结点?
因为叶子结点是在最后一层,只要把最后一层往上的关系都确定了,最后一层的关系不用管。
- 堆排序:重复取出堆顶元素,对剩下的元素进行堆化。