深度优先遍历
最深节点出栈,为访问节点入栈,访问过的节点出栈
二叉树的前序、中序、后序遍历,本质上也可以认为是深度优先遍历(更多是先序遍历推广)。第一种是一头扎到底的玩法。我们选择一条支路,尽可能不断地深入,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入。
深度优先遍历图的方法是,从图中某顶点v出发: a.访问顶点v; b.依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; c.若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
广度优先遍历(BFS)
二叉树的层序遍历,本质上也可以认为是深度优先遍历。距离开始点最近的那些顶点首先被访问,而最远的那些顶点则最后被访问,这个和树的层序变量很像,BFS的代码使用了一个队列。搜索步骤:
a .首先选择一个顶点作为起始顶点,并将其染成灰色,其余顶点为白色。 b. 将起始顶点放入队列中。 c. 从队列首部选出一个顶点,并找出所有与之邻接的顶点,将找到的邻接顶点放入队列尾部,将已访问过顶点涂成黑色,没访问过的顶点是白色。如果顶点的颜色是灰色,表示已经发现并且放入了队列,如果顶点的颜色是白色,表示还没有发现 d. 按照同样的方法处理队列中的下一个顶点。
平时使用的递归函数实际上用到了提供的函数系统栈
递归的过程可以看做递归函数依次进入函数栈的处理过程
所有用递归函数可以做的过程都一定可以用非递归的方式实现。