深度遍历与广度遍历

Posted 菜包包

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度遍历与广度遍历相关的知识,希望对你有一定的参考价值。

本盘文章是参考其他人的博客写的,只为自己记忆,参考者勿喷。

深度遍历:非递归,使用List保存已经访问过的节点

广度遍历:递归方式,List保存已经访问过的节点,使用Queue队列

具体图如下所示:

                               

package com.cust.grape;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Set;

/**
 * 
 * 描述:图的深度遍历和广度遍历
 * 深度遍历:
 * 	
 * 广度遍历:
 * 
 * @author cookie
 */
public class DeptSearch {
	public static void main(String[] args) {
		Node a = new Node(1);
		Node b = new Node(2);
		Node c = new Node(3);
		Node d = new Node(4);
		Node e = new Node(5);
		Node f = new Node(6);
		Node g = new Node(7);
		Node h = new Node(8);
		Node k = new Node(9);
		Arc ab = new Arc(a, b);
		Arc ac = new Arc(a, c);
		Arc ad = new Arc(a, d);
		Arc be = new Arc(b,e);
		Arc bf = new Arc(b,f);
		Arc cg = new Arc(c,g);
		Arc ch = new Arc(c,h);
		Arc ek = new Arc(e,k);
		a.aList.add(ab);
		a.aList.add(ac);
		a.aList.add(ad);
		b.aList.add(be);
		b.aList.add(bf);
		c.aList.add(cg);
		c.aList.add(ch);
		e.aList.add(ek);
		System.out.print("广度遍历:");
		widthSort(a);
		System.out.println();
		System.out.print("深度遍历:");
		List<Node> visited = new ArrayList<Node>();
		deptSort(a,visited);
	}
	/**深度遍历:递归向下*/
	public static void deptSort(Node a,List<Node> visited){
		if(visited.contains(a)){//访问过,直接返回
			return;
		}else{
			visited.add(a);
			System.out.print(a.val+" ");
			for (int i = 0; i < a.aList.size(); i++) {
				deptSort(a.aList.get(i).end,visited);
			}
		}
		
	}
	/**广度遍历:非递归*/
	public static void widthSort(Node start){
		Set<Node> visited = new HashSet<Node>();
		Queue<Node> queue =new LinkedList<Node>();
		queue.offer(start);//首元素进栈
		while(!queue.isEmpty()){//栈不为空时
			Node n = queue.poll();
			if(!visited.contains(n)){//没有访问过,继续;访问过的元素跳过,继续下一个
				System.out.print(n.val+" ");
				visited.add(n);
				for (int i = 0; i < n.aList.size(); i++) {//被弹出元素的下一行元素,并非所有的下一行元素
					queue.offer(n.aList.get(i).end);//节点关系的end节点
				}
			}
		}
	}
	
	
}


/**
 * 
 * 描述:节点
 * @author cookie
 */
class Node{
	public List<Arc> aList = new ArrayList<Arc>();
	public Integer val;//节点值
	public Node(Integer val) {
		this.val = val;
	}
} 
/**
 * 
 * 描述:节点之间的关系
 * @author cookie
 */
class Arc{
	public Node start;
	public Node end;
	public Arc(Node start, Node end) {
		this.start = start;
		this.end = end;
	}
}

  结果如下:

  广度遍历:1 2 3 4 5 6 7 8 9
  深度遍历:1 2 5 9 6 3 7 8 4

以上是关于深度遍历与广度遍历的主要内容,如果未能解决你的问题,请参考以下文章

深度优先遍历与广度优先遍历的区别

深度优先遍历 (DFS) 与广度优先遍历 (BFS)

图的深度/广度优先遍历C语言程序

图的遍历---深度优先遍历与广度优先遍历

深度遍历与广度遍历

二叉树——深度广度优先遍历