数据结构面试整理(4)

来源:互联网 发布:金工网络课程 编辑:程序博客网 时间:2024/05/01 04:04

11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。

11.1 前序遍历

根-左子树-右子树
非递归思路
a) 访问树的根节点,将根节点压入栈;
b) 取栈顶元素,访问该元素的左子树,跳到a) , 栈顶节点出栈,访问该节点的右子树,跳至a);
c)当所有节点访问完即最后访问的树节点为空且栈空时,停止。

11.2 中序遍历

左子树-根-右子树
非递归思路
a) 取树的根节点,将根节点压入栈;
b) 取栈顶元素,访问该元素的左子树,跳到a),访问栈顶节点,栈顶节点出栈,访问该节点的右子树,跳至a);
c)当所有节点访问完即最后访问的树节点为空且栈空时,停止。

11.3 后序遍历

左子树-右子树-根
非递归思路
a) 取树的根节点,将根节点压入栈;
b) 取栈顶元素,访问该元素的左子树,跳到a),栈顶节点出栈,访问该节点的右子树,跳至a),访问栈顶节点;
c)当所有节点访问完即最后访问的树节点为空且栈空时,停止。

11.4 层次遍历

借用队列

12. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。

图的存储结构:1)邻接矩阵 2)邻接表 3)十字链表(有向图) 4)多重邻接表

12.1 图的BFS算法

广度优先遍历(DFS):从图的某一结点出发,首先依次访问该结点的所有邻接顶点 Vi1, Vi2, …, Vin 再按这些顶点被访问的先后次序依次访问与它们相邻接的所有未被访问的顶点,重复此过程,直至所有顶点均被访问为止。
数据结构:队列

12.2 图的DFS

深度优先遍历(DFS):
1)访问指定的起始顶点;
2)若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之;反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕;
3)若此时图中尚有顶点未被访问,则再选其中一个顶点作为起始顶点并访问之,转 2; 反之,遍历结束。

12.3 最小生成树prim算法

在带权图中找到遍历树。
1)以顶点为线索
参考:最小生成树-Prim算法和Kruskal算法
算法中采用贪心算法。
设立一个集合,保存已经访问过的节点。
a)在未加入集合的节点中寻找距离集合中节点最近的节点,将连接的边加入最小生成树中,将该节点加入访问的节点;
b) 重复步骤a),直到所有节点都被加入集合
2)以边为线索
a) 以起始点为源头,找权重最小的边,加入边集合
b) 以边集合中的节点为源头,找权重最小的边,加入集合;
c) 重复b),直到所有节点都加入

12.4 最短路径Dijkstra算法

1) 定义概览
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径,以起始点为中心向外层层扩展,直到扩展到终点为止。注意该算法要求图中不存在负权边。
问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)
2.算法描述
1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
2)算法步骤:
a)初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v> 正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d)重复步骤b和c直到所有顶点都包含在S中。
实例:
这里写图片描述

S集合 最短路径 A B C D E F {A} {A} 0 6 3 {A,C} {A,C} 5 3 6 7 {A,C,B} {A,C,B} 5 6 7 {A,C,B,D} {A,C,D} 6 7 9 {A,C,B,D,E} {A,C,E} 7 9 {A,C,B,D,E} {A,C,D,F} 9

13. KMP算法

见前面

14. 排列组合问题

14.1 无重复全排列

全排列就是从第一个数字起每个数分别与它后面的数字交换。
递归实现:

14.2 带有重复的全排列

15. 动态规划、贪心算法、分治算法。(一般不会问到)

16. 大数据处理:类似10亿条数据找出最大的1000个数………等等

原创粉丝点击