我的Java学习-数据结构里图的深度优先搜索算法

数据结构的学习比较枯燥乏味,尤其是在学习搜索算法的时候。在反复的学习和代码的研究后,其实还是能够在里面找到些东西让自己回味。
图的深度优先搜索,从图的某一顶点v出发,遍历任何一个与v相邻的没有被访问的顶点v2,v3等,再从v2出发,遍历任何一个与v2相邻的没有被访问的顶点v4, v5等,重复直到所有顶点都被访问。
保存所有顶点最后显示出来,可以考虑用StringBuilder类对象,依次append()方法,将所有访问过的不重复的顶点加入进去。也可以用ArrayList 类对象,将顶点保存进去。如果只是显示出来,显然StringBuilder更加简单。
考虑某个顶点是否被访问过,可以使用boolean[number]数组方式来保存每个顶点的被访问情况,如果已经访问,将对应元素置为true。在遍历的算法里,添加数组元素的访问判断。
用栈来保存某个顶点出发相邻没有被访问的顶点。为什么用栈而不是其他的链表来完成呢?显然是栈更加合适,每次访问某一个顶点,栈提供给外界访问的只有栈顶元素,效率更高。栈的算法也简单,进栈,出栈。

public String depthFirstSearch(int v) {  //深度优先图的搜索算法
        if(v < 0 || v >= numOfVexs){                    //确保v是某一个顶点的数字
           throw new ArrayIndexOutOfBoundsException();
       }
       visited = new boolean[numOfVexs];                //设置访问标记
       StringBuilder sb = new StringBuilder();          //保存访问过顶点名称
       Stack<Integer> stack = new Stack<Integer>();     //用栈来完成遍历
       stack.push(v);                                   //将顶点的数字入栈
       visited[v] = true; 								//将顶点确定为已经访问
       while( !stack.isEmpty() ){
           v = stack.pop();
           sb.append(vexs[v] + ",");   		//顶点加入sb显示名称
           for(int i = numOfVexs - 1; i >= 0; i --){    //对所有顶点遍历
               if( (edges[v][i] != 0 && edges[v][i] != Integer.MAX_VALUE) 
                       && !visited[i] ){      //如果顶点i与v有连接并且没有被访问
                   stack.push(i);             //将顶点i入栈
                   visited[i] = true;
               }
           }
       }   		 //如果sb长度大于0,返回sb名称,否则返回空null
       return sb.length() > 0 ? sb.substring(0, sb.length() - 1) : null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值