第1章——绪论
数据结构的三要素
什么是抽象数据类型
一些数据对象以及附加在这些数据对象上的集合的操作
第2章——线性表
尾插法、头插法建立单链表
尾插法建立单链表,n个元素存储在数组a中
void createListR(LNode *&C,int a[],int n){
LNode *r,*s;
C=(LNode*)malloc(sizeof(LNode));
C->next=NULL;
r=C;
for(int i=0;i<n;i++){
s=(LNode*)malloc(sizeof(LNode));
s->val=a[i];
r->next=s;
r=r->next;
}
r->next=NULL;
}
头插法
void createListF(LNode *&C,int a[],int n){
LNode *s;
C=(LNode*)malloc(sizeof(LNode));
C->next=NULL;
for(int i=0;i<n;i++){
s=(LNode*)malloc(sizeof(LNode));
s->val=a[i];
s->next=C->next;
C->next=s;
}
}
栈和队列的区别
栈:只能在一端进行插入或删除操作的线性表
队列:操作受限的线性表,仅允许一端插入,另一端删除
第5章——数组、矩阵与广义表
稀疏矩阵如何存储
三元组、伪地址表示法(邻接表、十字链表)
第6章——树与二叉树
给定n个结点,能构造多少中不同的二叉树
Catlan函数:$ h(n)=\frac{C_{2n}^{n}}{n+1}$
树的相关概念
- 满二叉树:除了最后一层外,其他结点都有两棵子树
- 完全二叉树:除了最后一层外,其他任何一层的结点数都达到最大值,且最后一层只在右侧缺少结点
- 平衡二叉树:任何一个结点的左右子树高度不超过1
第7章——图
最小生成树和最短路径
- 迪杰斯特拉算法:求单源最短路径,边的权值不能为负
- 弗洛伊德算法:求任意顶点之间的最短路径
- 普里姆算法:无向图,稠密图
- 克鲁斯卡尔算法:无向图、稀疏图、并查集
第8章——排序
各种排序算法的性能
-
时间复杂度
快些归队:$n\log_{2}n$,其他:$n^{2}$
-
空间复杂度
快排:logn,归并:n,基数:r(关键字基的个数),其他都是1
-
算法稳定性
不稳定:快些选一堆
第9章——查找
B树和B+树
B树,又称多路平衡查找树, B 树中所有结点的孩子个数的最大值称为B 树的阶,通常用m 表示。一棵m 阶B 树或为空树,或为满足如下特性的m 叉树:
- 树中每个结点至多有m 棵子树,即至多含有m-1 个关键字。
- 若根结点不是终端结点,则至少有两棵子树。
- 除根结点外的所有非叶结点至少有「m/2] 棵子树,即至少含有「m/2]- 1 个关键字。
- 所有的叶结点都出现在同一层次上,并且不带信息(可以视为外部结点或类似千折半查找判定 树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空)。
B 树是所有结点的平衡因子均等于0 的多路平衡查找树。
B+树是应数据库所需而出现的一种B 树的变形树。
一棵m 阶的B+树需满足下列条件:
- 每个分支结点最多有m 棵子树(孩子结点)。
- 非叶根结点至少有两棵子树,其他每个分支结点至少有「m/2]棵子树。
- 结点的子树个数与关键字个数相等。
- 所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列, 并且相邻叶结点按大小顺序相互链接起来。
- 所有分支结点(可视为索引的索引)中仅包含它的各个子结点(即下一级的索引块)中 关键字的最大值及指向其子结点的指针。