1)深度优先遍历(deep first traverse)
定义:假设给定图G的初态是所有顶点均未曾访问过,在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止,这里定义使用的就是递归定义。
图的深度优先遍历类似于树的前序遍历,采用的搜索方法的特点是尽可能先对纵深方向进行搜索。这种搜索方法称为深度优先搜索(Depth-First Search)。相应地,用此方法遍历图就很自然地称之为图的深度优先遍历
递归方式实现深度遍历的编码思想:所谓深度优先就是以纵向优先的方式遍历节点。我们从当前节点curr出发,如果当前节点被访问过,就返回,否则将该节点标记为访问过的节点,然后在递归访问当前节点的所有邻接节点。
伪代码:
function traverse(Node node){ //递归方式实现的深度优先遍历
if(node.isVisited){ //如果当前节点已经被访问过
return; //这个是递归出口
}
node.isVisited=true; //将当前节点置为已经访问
for(var i=0;i<node.brother.length;i++){
traverse(node.