1. 在“树”这一结构中,其存储结构有【孩子表示法】,【父母表示法】,【孩子兄弟表示法】,但它们都是人为定义的,在实际操作中我们使用树时需要结合实际情况创造出合适的树的存储结构,在考虑时间与空间复杂度的情况下可以将以上三种操作结合起来。
2. “树”的遍历分为【前序遍历】,【后序遍历】,【层次遍历】;
“二叉树”的遍历分为【前序遍历】,【中序遍历】,【后序遍历】,【层次遍历】;
其中两者的前序与层次遍历相同,其余不同,不同之处在于算法的递归程序不同,在编写遍历代码过程中我们不需要去思考怎样去递归,只需要记住这种遍历需要那种代码顺序
3. “二叉树”,“树”,“森林”三者之间可以相互转换,每个都有着其自己的遍历,转换方法具体在【大话数据结构】6.11节
4.在“树”中,创造出符合实际情况的结构以及遍历是十分重要的
5.在“树”中,需要用到离散数学的知识,学好离散数学对于数据结构十分重要
6. 二叉排序树:
【1】是二叉树
【2】左子树结点小于根结点值
【3】右子树结点大于根结点值
【4】左,右子树本身是一棵二叉树
丰满树:任意两个非双孩子结点的高度之差绝对值小于等于1的二叉树;
平衡二叉排序树:左子树和右子树都是平衡二叉树,且左子树,右子树高度之差绝对值不超过1;
扩充二叉树:给的一棵二叉树,对于树中不足两个孩子的结点(包括叶子结点),都填上附加结点,使每个结点都有两个孩子结点;
最佳二叉排序树:在n个内部结点和n+1个外部结点构成的所有可能的扩充查找树中,具有最少平均次数,称为最佳二叉排序树;
Huffman树:具有最小带权外部路径长度的二叉树称为Huffman树;
7. 排序
【1】插入排序:直接插入排序,表插入排序,shell插入排序,二分法插入排序
【2】选择排序:直接选择排序,树型选择排序,堆排序
【3】交换排序:冒泡排序,快速排序
【4】归并排序
【5】基数排序
8. 堆排序如何插入
将待插入元素看作数组,从左至右依次插入,形成二叉树,如4,2,5,8,3,根据**堆排序**可快速找出最小结点(为根结点)
9. 二叉树的遍历算法(递归)
前序遍历
if (t)
{
printf("%c", t->data);
preorder(t->lchild);
preorder(t->rchild);
}
中序遍历
if (t)
{
inorder(t->lchild);
printf("%c", t->data);
inorder(t->rchild);
}
后序遍历
if (t)
{
postorder(t->lchild);
postorder(t->rchild);
printf("%c", t->data);
}
简单来说,二叉树的前、中、后序遍历的printf语句分别在1、2、3位置
10. 队列
front 指示队首结点在数组中元素下标;
rear指示队尾结点在数组中元素下标的下一位;
队列从队首删除,从队尾插入;
11. 循环队列
front与rear同队列意义相同;
当rear=front时,说明再删除一个结点则队列将空或再插入一个结点则队列将满;
为了解决这一问题,可以使数组大小为MAXSIZE的数组,只能存放MAXSIZE-1个元素,则(rear+1)%MAXSIZE=front表示满,rear=front 表示空;
12. 循环单链表
好处是可以从任意结点开始访问到链表中任意结点
13. 双链表
好处是可以快速知道一个结点的前驱和后继
14.链式栈
链式栈的插入和删除只能从top端进行
15.链式队列
链式队列的插入和删除只能分别从front和rear端进行
16.快速排序
从n个待排序记录中任选一个,将其放在他应该放置的位置上,使前面的数都小于它,后面的数都大于它,再选一个数,重复上述步骤,如46,79,56,38,40,80,95,24创建一个数组,将x和其他记录的排序码逐个比较,将排序码不大于x的记录从第1个位置由左向右顺序存放,而将怕排序码大于x的记录从最后一个位置从右向左顺序存放
17.散列存储
是将一组元素通过同一特定函数存储在一数组中,若元素通过函数所构成的结果在数组中位置相同 ,则进行冲突处理;
一般冲突处理方法:开放定址法(线性探索法):就是将冲突元素放入数组的下一空单元;
18.排序
1.直接插入排序:将记录R的排序码与已经排好序的排序码从右向左依次比较,找到R应插入的位置,将该位置以后直到R-1的各记录顺序后移,空位置让R插入
2.二分法插入排序:利用二分法在线性表中进行插入排序
3.表插入排序:主要是在链表中插入排序
4.直接选择排序:将n个待排序记录中选择排序码最小的,与第一个记录进行交换,再从n-1个中选择最小的,与第二个交换
5.树型选择排序:将待排序元素两两组合进行排序,像比赛一样得出最小结果
6.冒泡排序:将所有记录从左到右每相邻两个记录的排序码进行比较,不符合要求,则进行交换,一趟完成后,排序码最大者放在最后,再重复步骤
19.树
树的表示方法:
双亲表示法:数组
孩子表示法:数组,链表,指针
孩子兄弟表示法:指针
树的遍历:前序,中序,后序
20.最小生成树
1.普里姆算法(prim):任意选取一点,加入点集U,构造该点与其他顶点的两栖边,选取最小的一个,加入点集U,则U与U-v的点重新形成了两栖边,选取最小的,重复上述步骤
2.克鲁斯卡尔算法( kruskal):按权非递减顺序连接边,不形成回路,直至由n-1条边为止(n为顶点数)
注:只有图有最小生成树,生成树是指图的一个子图是树,才称为生成树
21.哈夫曼树(Huffman)
具有最小带权外部路径长度,哈夫曼树根据离散数学知识进行构造
22.二叉排序树
特点:
1.左子树非空,左子树所有结点值均小于根结点值;
2.右子树非空,右子树所有结点值均大于根结点值;
3.它的左、右子树本身又各是一棵二叉排序树;
23.ASL(平均查找长度)
24.树、二叉树的转换
树->二叉树:
1.在所有兄弟结点间加一条连线;
2.除保留其到第一个子女的连线外,撤销到其他子女的连线;
3.将以上得到的树按照顺时针旋转45°;
二叉树->树:
1.将二叉树按逆时针旋转45°;
2.若结点是其双亲的左子女,则把该结点的右子女、右子女的右子女......都与该结点的双亲用线连接起来;
3.去点原二叉树所有双亲到右子女的连线;
25.字符串
字符串的储存方式有顺序表和链式表两种;
字符串的模式匹配是指字符串p在字符串t中首次出现的起始位置,有两种:朴素的模式匹配算法、快速模式匹配算法,属于字符串的检索;
26.时间复杂度
27.最短路径和关键路径
最短路径:
Dijkstra:从某个源点到其他各顶点的最短路径(单源最短路径);
Floyd:每一对顶点之间的最短路径;
关键路径:
AOE网:有向图中,顶点表示事件,弧表示活动,弧上的权值表示活动持续时间,这样的有向图称为边表示活动的网;
AOV网:有向无环图中,顶点表示活动,用弧表示活动的优先关系的有向图称为顶点表示活动的网;