各位看官们,大家好,上一回中咱们说的是深度优先遍历的例子,这一回咱们继续说:深度优先遍历。闲
话休提,言归正转。让我们一起talk C栗子吧!
大家可能会问:咱们上一回刚刚说了深度优先遍历呀,怎么这一回还说它?看官们莫急,我们在上一回中
说了如何使用深度优先遍历方法去遍历图,在实现该方法时使用的是递归原理。我们在这一回中使用循环
原理来实现深度优先遍历,也就是说这是同一个遍历方法的两种不同实现形式。关于深度优先编译的原理
我就不说了,我们重点说下如何使用循环来实现深度优先遍历。循环说着很容易,但是操作起来也不是那
么的容易,下面是具体的实现步骤:
- 1.使用邻接矩阵存放图,邻接矩阵中位于行和列上面点的顺序可以自己定义;
- 2.把图中点的名称按照点在邻接矩阵中行或者列上的顺序存放一个数组中;
- 3.使用一个数组来标记各个点是否被访问过,数组的大小为图中点的数量;
- 4.从邻接矩阵中,选取一个点依次遍历图,通常选择第一个点;
- 5.把该点在邻接矩阵中的列数圧入栈中;
- 6.在步骤3中的数组中标记该点已经被访问过;
- 7.将栈中的元素出栈,把该元素的值当作邻接矩阵的行数;
- 8.查找邻接矩阵中位于该行的点与其它点之间是否有路径,如果没有路径返回步骤7,否则进行步骤9;
- 9.判断有路径的点是否被访问过。如果已经被访问过,回到步骤7,否则回到步骤5;
- 10.重复步骤7到9,直到栈中没有元素为止;
看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。
我们在例子中使用了栈,通过栈来控制遍历的深度。其实在递归中也隐含地使用了栈,只是没有明显地写
出来而已。例子中关于栈的代码写的比较粗糙,更好的代码请点击这里查看我们在前面章回中关于栈的讲
解。程序中使用的图和上一回中的图一样,下面是图及其邻接矩阵:
基于该图的运行结果如下所示。大家和上一回的结果比较一下,你会发现,这两种结果是一样的,这也说
明了我们使用不同的方法实现了深度优先遍历,真是殊途同归呀!
--- Show the Graph ---
0 |1 |1 |0 |0 |0 |
1 |0 |0 |0 |1 |0 |
1 |0 |0 |1 |0 |1 |
0 |0 |1 |0 |0 |0 |
0 |1 |0 |0 |0 |1 |
0 |0 |1 |1 |1 |0 |
--- DFS ---
A->B->E->F->C->D->
各位看官,关于深度优先遍历的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。