目录
线性结构
每个元素最多只有一个出度和入度
存储结构分为顺序表和链表
顺序存储:用地址连续的存储单元存储线性表的数据,逻辑上相邻的元素物理也相邻
链式存储:地址不要求连续,元素逻辑上连续,物理上不连续
链式存储不仅有数据还有 指针域,所以密度小
查找运算,顺序存储更好
破坏性的操作(插入、删除)链式存储更好,只要将指针断开即可,不需要破坏的操作,顺序存储更好
单链表
插入:新加的结点的指针域指向后一个结点,再将前一个结点的指针域指向新加的结点
删除:将要删的结点前一个结点的指针域指向后一个结点的指针域,free(q)释放q指针的内存
栈与队列
队列是先进先出,栈是先进后出
栈有两个进出的口,所以是先进先出,栈只有一个口,所以是先进后出
循环队列:一般队列少存一个元素,所以队列满的条件是tail+1=head
size是队列能存的最大长度
队列长度的公式为(tail-head)%size
优先队列:元素被赋予优先级,最高优先级的元素最先删除,使用堆来存储
串
特殊的线性表,数据元素是字符
基本模式匹配算法:从主串第一个字符开始与模式串比较,相等就逐个比较后面的字符,不相等就从主串的下一个字符开始比较
KMP算法:与基本模式匹配算法类似,但是匹配字符不相等时不需要回溯主串的字符位置,直接从不匹配的字符开始向后重新比较
数组
一维数组是线性的
数组结构特点:数目固定、类型相同、下表具有上下界的约束且下表有序
矩阵
特殊矩阵:矩阵分布有一定规律,有
对称矩阵:aij=aji
对角矩阵:非零元素集中在主对角线中心带状区域,其他都是0
三角矩阵:矩阵中主对角线上方都是非零元素,下方全是零元素(上三角矩阵),或相反(下三角矩阵)
稀疏矩阵:非零元素很少且分布没有规律,储存方式是三元组结构,即存储每个非零元素的行、列、值
矩阵计算采用特殊值法:
特殊值a1,1的i=1,j=1,只需要带入其中看哪个选项的k=1即可
广义表
LS是表名,ai是表元素
LS=(a1,a2,...,an)
广义表的元素既可以是表也可以是元素
广义表的长度就是最外层包含的元素个数
递归定义的重数就是广义表的深度,只需要看单边括号有几层深度就为几
head()取表头,tail()取表尾,表头可以是单元素,也可以是表,广义表的表尾一定是表
树
树中的每个元素可以有两个或两个以上的后继元素,用来描述层次结构关系
在非空树中只有一个根节点
结点的度:一个结点的子树的个数记为结点的度
子叶结点 :度为零的结点
内部结点:度不为零的结点
结点的层数:从根节点到他经历多少代,就是几层
有序树:树中结点的子节点可以相互交换称为无序树,从左到右具有次序不能交换的叫有序树
二叉树
完全二叉树,除了最底层其他节点都是双节点
满二叉树,全部节点都是双节点
只能指向两个节点的树,一个左节点,一个右节点
第n层最多有2^(n-1)个节点
高度为k的树最多有2^k-1个节点
总节点数:单分支节点数+双分支节点数*2
总分支数=总节点数-1
对一颗有n个节点的完全二叉树的所有节点按照自上而下、自左向右进行编号 则对应任意节点i(1<=i<=n)有
- 若i=1,则节点是二叉树的根,无双亲,若i>1,则其双亲为i/2(向下取整)如3/2=2
- 若2i>n,则节点i没有左孩子,否则则其左孩子为2i
- 若2i+1>n,则节点i没有右孩子,否则右孩子为2i+1
二叉树的遍历
先序遍历是先根节点再左节点,最后是右节点
中序是左根右
后续是左右根
层次遍历:从上到下,从左到右
线索二叉树
n个节点的二叉树有n+1个空指针域
两个标志占1bit,用什么遍历则存放什么标志
最优二叉树
树的路径长度:根节点到达每个子叶节点的路径长度之和
结点的带权路径长度:该节点的权值乘该节点到根结点的路径长度
树的带权路径长度:所有子叶结点的带权路径长度之和
给出一组权值将两个最小的权值作为子叶节点,其和作为父节点,组成二叉树,然后把最小的两个值删除,加入其父节点,重复步骤,这个树的带权路径长度是最小的,一层中小的在左边,大的在右边,左边为0,右边为1
树和森林
树与二叉树的转换:树的最左边结点作为二叉树的左子树,树的其他兄弟结点作为二叉树的右子树结点
查找二叉树
左孩子结点值都小于父节点,有孩子结点大于父节点,用中序排列是从小到大排序的
平衡二叉树
左右子树层次相差不超过1
图
无向图:结点之间没有箭头
有向图:结点之间连接线是有箭头的
有向图的度是出度和入度之和
有向图两个顶点间相互存在路径,称为强连通图
图的存储
邻接矩阵:n个结点就是n阶矩阵,i结点与j结点相连的话a[i][j] = 1,否则等于0
无向图沿对角线对称
邻接链表;将结点用一维数组存储,对每一个顶点,使用链表挂上和其有连线的结点编号和权值
图的遍历
深度优先遍历:从一个顶点开始遍历到底,直到返回,再任取其他结点,直到遍历玩整个图
广度优先遍历:先访问完一个顶点的所有邻接结点,再依次访问其邻接结点的所有邻接结点
图的最小生成树
克鲁斯卡尔算法:从边出发,按权值大小排序,选取权值最小的n-1条边,直至囊括所有结点
网稠密的时候普利姆算法更好,效率都差不多
图的拓补序列
以顶点表示活动,用有向边表示活动之间的优先关系
不能有回路
构造方法:先找入度为零的点,先执行,然后删除与其相关的有向边,重复执行