java实现图的深度优先遍历和广度优先遍
首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕;如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先遍历就类似于树的层序遍历了,即一层一层的去遍历节点,直至所有节点都被访问完毕。
不多说,直接上代码,会对部分代码添加说明。
import java.util.*; public class Traverse{ public static void main(String[] args){ //接受输入,比如int类型,节点Node存储各个图节点;Path存储各个节点作为开始的路径 Traverse tr = new Traverse(); System.out.print("深度优先遍历是:"); ArrayList<Node>visited = new ArrayList<>(); visited.add(a); tr.depthFirstSearch(a); System.out.print("广度优先遍历是:"); tr.wudthSearch(a); } public void depthFirstSearch(Node a,List<Node> visited){ for(int i=0;i<a.out.size();i++){ Node cur = a.out.get(i).end; //打印当前结点 System.out.println(cur.node); if(!visited.contains(cur)){ visited.add(cur); depthFirstSearch(cur,visited); } } } public void widthSearch(Node a){ Set<Node> visited = new HashSet<>(); Queue<Node> q = LinkedList<>(); q.offer(a); while(!q.isEmpty()){ Node cur = q.poll(); //检查是否已访问该节点,避免重复访问 if(!visited.contains(cur)){ visited.add(cur); //打印当前结点 System.out.println(cur.node); } for(int i =0;i<a.out.size();i++){ q.offer(a.out.get(i).end); } } } } //节点 class Node{ int node; ArrayList<Path>out; public Node(int node){ //初始化 this.node = node ; out = new ArrayList<>() } } //路径 class Path{ Node start; Node end; public Path(Node start,Node end){ this.start=start; this.end=end; } }