简介
深度优先与广度优先算法,从名字上便很好理解,以在二叉树结构中搜索某一值为例:
- 深度优先算法将从顶点V开始,沿着一个路径一直走到底(叶子节点),如果搜索到目标值则退出,否则返回上一个还有子节点未被搜索的节点继续搜索。
- 广度优先算法将从顶点V开始,依次访问当前节点未被访问过的子节点,再从子节出发,继续访问他们的子节点,直到所有节点被访问。(相当于树的层次遍历)
- 一般说来,能用DFS解决的问题都能用BFS解决。DFS通过递归实现,易于实现,DFS的常数时间开销会比较少,所以大多数情况下优先考虑DFS实现。然后就是,DFS容易栈溢出,而BFS可以自己控制队列的长度。
BFS
基本实现思想:
(1)顶点v入队列。
(2)当队列非空时则继续执行,否则算法结束。
(3)出队列取得队头顶点v;
(4)查找顶点v的所以子节点,并依次进入队列;
(5)转到步骤(2)。
树的层次遍历
- 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- 这里使用2个数组保存节点,也可以使用queue这一数据结构。
|
|
DFS
递归实现:
(1)访问顶点v,打印节点;
(2)遍历v的子节点w,while(w存在),递归执行该节点;
非递归实现:
(1)访问顶点v,顶点v入栈S,打印输出顶点,visited[v]=1
(2)while(栈S非空)
x=栈S的顶元素(不出栈);
if(存在并找到未被访问的x的子结点w)
访问w,打印输出,visited[w]=1;w进栈;
else
x出栈;
注:visited[x]=1,标记该节点已被访问
二叉树的深度
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
|
|
二叉树中和为某一值的路径
- 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
|
|
迷宫寻路问题
推箱子
- 这是网易的一道笔试题,需要将箱子推到指定位置。输入一张地图,其中*表示箱子,X表示人,@表示目的地,#表示障碍。
- 这道题采用广度优先算法,第一次将箱子推送到目标地即为最短路径。使用st[x][y][bx][by](人位 置(x,y),箱子位置(bx,by) )记录状态,防止重复的路径。
|
|
迷宫寻路
- 请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,3-迷宫的出口,大写字母-门,小写字母-对应大写字母所代表的门的钥匙
|
|