文章目录
考点提要
- 数组与矩阵
- 线性表
- 广义表
- 树与二叉树
- 图
- 排序与查找
- 时间复杂度与空间复杂度
- 算法基础及常见的算法
一、数组
数组类型 | 存储地址计算 |
---|---|
一维数组a[n] | a[i]的存储地址为:a+i*len |
二维数组a[m][n] (从0开始) | a[i][j]的存储地址(按行存储)为:a + (i*n+j)*len a[i][j]的存储地址(按列存储)为:a+(j * m+i)*len |
二、稀疏矩阵
- 上三角矩阵
- 下三角矩阵
考试的时候,使用代入的方式进行求解
三、线性表
- 顺序表
- 链表
- 单链表
- 循环链表
- 双向链表
- 链表的基本操作
- 单链表删除结点
- 单链表插入结点
- 双向链表删除结点
- 双向链表插入结点
- 顺序存储与链式存储对比
- 空间性能:顺序表的存储比链式表好
- 时间性能:顺序表的读运算优于链式表;查找、插入、删除,链表性能更好
- 队列与栈
- 队列:先进先出
- 栈:先进后出
- 循环队列:队空条件:head = tail;队满条件:(tail + 1) % maxsize = head
四、广义表
- 概念:线性表的推广,是由0个或多个单元素或子表所组成的有限序列。
- 记作:LS = (α1, α2, … , αn)
α既可以是单个元素,也可以是广义表,分别称为原子和子表。 - 深度与长度
- 深度:广义表展开后所含的括号的最大层数。
- 长度:广义表中元素的个数。
- eg:LS1 = (a, (b, c), (d, e)),其长度为3,深度为2.
- 基本操作
- 取表头head(LS)。非空广义表LS的第一个元素称为表头。它可以是一个单元素,也可以是一个子表。
- 取表尾tail(LS)。在非空广义表中,除表头元素之外,由其余元素所构成的表称为表尾。非空广义表的表尾必定是一个表。
- eg:LS1 = (a, (b, c), (d, e)),取出元素b的操作?
head(head(tail(LS1)))
解析:tail(LS1) >>> ((b, c), (d, e)); head(tail(LS1)) >>> (b,c); head(head(tail(LS1))) >>> b
五、树与二叉树
-
树的基本概念
- 结点的度:结点1:2;结点3: 1
- 树的度:2(所有结点的度中最大的一个)
- 叶子结点:4、5、7、8(没有孩子的结点)
- 分支结点:1、2、3、6(度不为0的结点)
- 内部结点:2、3、6(除根节点之外的分支结点)
- 父结点:有孩子的结点
- 子结点:有爹的结点
- 兄弟结点:4与5 、7与8、2与3
- 层次(树的深度(高度)):4
-
二叉树的定义与基本性质
- 识别满二叉树、完全二叉树、非完全二叉树。
满二叉树:每个结点的度都为2;
完全二叉树:从左到右没有断裂,也即有右结点必有左结点;
非完全二叉树:从左到右出现断层。
- 二叉树的重要性质
- 二叉树第i层上的节点数目最多为2i-1(i ≥ 1)
- 深度为k的二叉树至多有2k-1个结点(k≥1)
- 在任意一颗二叉树中,若叶子节点数为n0,度为2的节点数为n2,则n0=n2+1
- 具有n个节点的完全二叉树的深度为⌊log2n⌋+1
- 对一颗有n个节点的完全二叉树,对任一节点i有:
- 若 i > 1, 则其父节点为⌊i/2⌋
- 若 2i > n,则节点i无左孩子,否则其左孩子为2i
- 若2i + 1 > n,则节点i无右孩子,否则其右孩子为2i+1
- 二叉树的遍历
-
前序遍历:1 2 4 5 7 8 3 6(根左右)
-
中序遍历:4 2 7 8 5 1 3 6(左根右)
-
后序遍历:4 8 7 5 2 6 3 1(左右根)
-
层次遍历:1 2 3 4 5 6 7 8(从上到下,从左到右)
-
中序遍历讲解、后序遍历可以模仿这个来
参考资料:https://blog.csdn.net/qq_33243189/article/details/80222629
-
- 反向构造二叉树
必须有中序遍历
eg:前序遍历ABHFDECG、中序遍历HBEDFAGC
- 树转二叉树
- 孩子节点——变成左子树节点
- 兄弟节点——变成右孩子节点
- 查找二叉树(二叉排序树)
- 基本特性:
左孩子小于根
右孩子大于根 - 操作:
- 插入节点:按照基本特性进行插入
- 删除节点:
- 删除叶子节点51,直接删除
- 删除有一个孩子的节点56,将56删除,将其孩子51放到56原来的位置
- 删除有两个孩子的节点89,先在左子树上进行中序遍历寻找到最大的节点56
- 基本特性:
- 最优二叉树(哈夫曼树)
- 基本概念
- 树的路径长度
- 权
- 带权路径长度
- 树的带权路径长度(树的代价)
- 构造哈夫曼树
- 基本概念
- 线索二叉树:将树型转化为线性,了解即可
- 平衡二叉树
- 什么是平衡二叉树?
- 任意结点左右子树深度相差不超过1
- 任意结点左子树深度-右子树深度 = 1 或 0 或 -1
- 什么是平衡二叉树?
- 识别满二叉树、完全二叉树、非完全二叉树。
六、图
1.基本概念
- 完全图:
- 无向图中,若每对定点之间都有一条边相连,则称该图为完全图
- 有向图中,若每对顶点之间都有二条有向边相互连接,则称该图为完全图。
- 无向图中,若每对定点之间都有一条边相连,则称该图为完全图
2. 图的存储——邻接矩阵
用一个n阶方阵R来存放图中各节点的关联信息,其矩阵元素Rij定义为
eg:
3. 图的存储——邻接表
首先把每个顶点的邻接顶点用链表示出来,然后用一个一维数组来顺序存储上面每个链表的头指针。
4. 图的遍历
- 深度优先遍历:1 2 4 8 5 3 6 7(优先向下,左边优先)
- 广度优先遍历:1 2 3 4 5 6 7 8(优先横向,左边优先)
- 使用邻接表复原图
5. 拓扑排序(了解就行了)
我们把用有向边表示活动之间开始的先后关系。即AOV网络