数据结构与算法之深度搜索(理论+代码)

一,图的简介

      图是一种与树有些相似的数据结构,实际上在数学理论中,树是图的一种形式,但在计算机程序中,图的应用方式与树不一样。图通常有固定的形状,这形状由物理或抽象的问题所决定的,如图,节点表示城市,边为公路,可以将此现实生活中的地图抽象为图b,当讨论图时,节点通常叫做顶点。

    1,连接:如果2个顶点被一条边连接,我们就说这两点是连接的,图中A 和 E是连接的,I与F就不是连接的 。

    2,路径:路劲就边的序列,比如A到J的路径就是 A EJ或ACDJ等等。

    3,有向图和带权图:下篇博客再讨论带权图和有向图,此文章只讨论无向图,无权图。



二,在程序中表示图

      1,顶点:在程序中,只是简单的把顶点编号 ,根据程序语言惯例,从0到N-1进行编号(N为顶点个数),但在现实生活中顶点是有真实的对象,比如顶点表示城市时,那么顶点应该包含城市的名称,位置,海拔等等,所以通常将顶点设计成一个类,此篇文章例子只存一个字母。同时还要有个下标表示顶点,下标将在数组中起到关键作用。

 顶点类如下:

   

顶点对象存在数组中,然后用下标表示顶点,本例子中,用数组vertexList表示。

     2 ,边:通常边的表示方法有2种:链接矩阵和链接表,本例子讨论链接矩阵。链接矩阵是一个2维数组,有N个顶点就产生 N*N 2维数组

   

有4个顶点,1表示2顶点是链接的,如图A的下一个链接顶点一次为B,C,D。


三,在图中添加顶点与边

 

vertexList为顶点集合数组,nvertx为当前集合的顶点数


增加边,正反方向都设置为1 ;


四,Grouph类:创建链接表,链接矩阵,插入顶点与边。



五,搜索

 深度搜索需要做三件事:首先访问顶点,其次把该点放入栈中,最后标记该点。


步骤:

   先访问入口A,标记A,把A放入栈中。假设规定按照脚标顺序访问,查找A点的链接点,那么接下来访问B,标记B,把B放入栈中,做相同的是直到访问到H,标记H,把H放入栈中。

   规则1:如果可能,访问节点,标记节点,节点放入栈中。

   再次应用规则1,查找H的链接节点,没有找到,栈弹出H,查找栈顶F未访问过的链接点,没有找到,弹出F,查找栈顶B的链接顶点,执行相同步骤,直到弹出B,找A的未访问过的链接顶点。

  规则2:当不能执行规则1时,若栈不为控,弹出栈顶节点

  接着访问A的链接点C,然后D G I 最后E

  规则3:如果不能执行规则1和规则2,就完成了整个搜索过程


在此搜索过程中,寻找某点的未访问过的连接点尤为重要,具体方法如下


根据规则123,设计搜索方法



栈的设计同样重要 ,代码如下


启动类如下


   此篇文章参考JAVA数据结构与算法,转载请标识来源。

   要源码可向我留言。





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值