数组与矩阵
线性表(必考)
栈
队列
广义表
了解基本概念和操作即可
广义表:表里的元素可以是表(子表)也可以是数据元素(原子)
LS1 = (a, (b, c), (d, e))
广义表的 长度
:最外一层的表有几个元素(3)
广义表的 深度
:有几层(2)
表头
:第一个数据
表尾
:除第一个数据之外的其他数据组成的表(不是只最后一个)
head(LS1) = a
tail(LS1) = ((b, c), (d, e))
例题
如何将 b 取出?
head(head(tail(LS1)))
树与二叉树(必考)
- 结点的度
- 树的度
- 叶子结点
- 分支结点
- 内部结点
- 父结点
- 子结点
- 兄弟结点
- 层次
树的度只看它有多少个儿子,不算父亲给它的那个支
兄弟节点只有亲兄弟算
满二叉树/完全二叉树
前序/中序/后序遍历
反向构造二叉树
给前序和中序遍历序列,构造二叉树
树转二叉树
第一个孩子结点变成左子树结点,其他孩子连成一串,变成左孩子的右孩子一支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9X5xFQh-1680763022261)(/assets/image_fq9bd5m68.png)]
二叉树转树
连续撇向右的几个都转化成兄弟
查找二叉树
删除结点的方式:
- 找左子树上最大的那个点,进行交换
- 交换后
- 变叶子结点,直接删掉
- 变只有一个左叶子孩子的结点了
- 让左叶子孩子直接连上父亲
- 删掉
哈夫曼树(最优二叉树)
目标:构造最短的带权路径长度的树,用于哈夫曼编码
概念:
- 树的路径长度:树的根到结点的深度
- 权:
叶子
结点上的数字 - 带权路径长度:权*路径长度
- 所以根结点、内部结点带权路径长度是 0(不算他们的带权路径)
- 树的带权路径长度:(权*路径长度)之和
构造哈夫曼树的方法
每次选取最小的两个结点结合起来形成一个新的结点(所有方形结点都是新创造出来的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-admie7fM-1680763022262)(/assets/image_6wmwdvxyq.png)]
线索二叉树
将空闲的左/右指针指向上一个/下一个要遍历的结点,方便遍历
分类:
- 前序线索二叉树
- 中序线索二叉树
- 后序线索二叉树
平衡二叉树
定义(平衡度)
- 左右子树深度相差<=1
平衡度
为-1 0 1- 平衡度:左子树深度-右子树深度
图
了解基本概念和操作即可
无向图
有向图
完全图:任意两点有线连接,若是有向图,要连两个方向
邻接矩阵
邻接表
深度优先遍历
广度优先遍历
拓扑排序
AOV 网络:用顶点表示活动,有向边代表活动先后关系
图的最小生成树算法
普里姆算法
每次连接联通块相连的最短的边(要是联通块与外部点)
克鲁斯卡尔算法
先把所有的边都断掉,每次选取最小的边加上,加上形成环路的不连,直到选出 N-1 条
排序与查找(必考)
查找
顺序查找
O(n)
二分查找
O ( l o g 2 n ) O(log_2n) O(log2n)
散列表查找
散列表冲突的解决方式
- 线性探测法
- 伪随机数法:随机放
- 再散列:冲突后用不同的散列函数再散列一次
排序分类
稳定排序 vs 不稳定排序
内排序 vs 外排序
插入类排序
直接插入排序 O(n²)
希尔排序 O(n^1.3) ~ O(n²) 不稳定
本质上是分组插入排序
- d = n/2,向上取奇数
- mod d 为同一个值的下标的数作为一组
- 对每组进行插入排序
- d = d/2,取奇数
- …
- 直到 d == 1
交换类排序
冒泡排序 O(n²)
快速排序 O(nlogn) ~ O(n²) 不稳定
分治法
- 任取一个记录
- 将比它小的记录移到它左边,比它大的记录移到它右边
- 递归左边,右边
选择类排序
简单选择排序 O(n²) 不稳定
为什么不稳定:因为每次找到最小的放到前面的时候,并不是数组往后平移,而是直接交换
所以后面的数组被
堆排序 O(nlogn) 不稳定
利用小顶堆/大顶堆排序
小顶堆:每个结点都比两个孩子小
大。。。。。。。。。。。。。大
建堆
以大顶堆建立为例
- 按照完全二叉树的形式将各个值放在结点上
- 从
最后一个
非叶结点开始检查(最后一个指层次遍历的最后一个)- 若
一个
子结点比它大,直接交换 - 若
两个
子结点都比它大- 把最大的那个作为父结点
- 如果造成了下面的次序混乱,要向下继续调整
- 若
进行堆排序
以大顶堆为例
- 每次取走堆顶元素
- 将层次遍历的最后一个元素放到堆顶的位置
- 从上到下调整堆
归并排序 O(nlogn)(了解思路即可)
每次都把两个已经排好序的合并起来排序
需要 O(n) 的额外空间
基数排序 O(d(r+n))(了解思路即可)
- 按照个位相同的顺序依次放入桶中
11 242 93 24 135 19 192 345
=>
11 242 192 93 24 135 345 19
- 按照十位相同的顺序依次放入桶中
11 24 135 242 192 19 245 345 93
这样,每桶
十位
相同的数,可以保证个位
的顺序是对的
=>
11 19 24 135 242 345 192 93
- 按照百位相同的顺序依次放入桶中
11 135 242 345 19 192 24 93
这样,每桶
百位
相同的数,可以保证十位和个位
的顺序是对的
=>
11 19 24 93 135 192 242 345
排序完成