图的深度遍历和广度遍历(JAVA)

本文介绍了如何使用Java实现图的邻接矩阵表示,并详细讲解了深度优先搜索(DFS)和广度优先搜索(BFS)算法,包括插入节点、添加边和遍历操作。通过实例展示了如何在Gragh类中使用这些方法,适用于理解图论在信息技术中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package Graph_tu;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

public class Gragh {

	private ArrayList<String>vertexList;//存储节点
	private int[][]edges;//存储邻接矩阵
	private int numofEdges;
	private static boolean[] isVisited;//判断节点是否访问
	
	//构造
	public Gragh(int n)  {
	vertexList=new ArrayList<String>(n);
	edges=new int[n][n];
	numofEdges=0;
	}
	
	//节点数
	public int getnumofVertex() {
		return vertexList.size();
	}
	//边数
	public int getnumofEdges() {
		return numofEdges;
	}
	//节点i
	public String getValueofIndex(int i) {
		return vertexList.get(i);
	}
	
	//v1-v2权值
	public int getWeight(int v1,int v2) {
		return edges[v1][v2];
	}
	
	//插入节点
	public void insertVertex(String vertex) {
		vertexList.add(vertex);
	}
	
	//添加边
	public void insertEdge(int v1,int v2,int w) {
		edges[v1][v2]=w;
		edges[v2][v1]=w;
		numofEdges++;
	}
	
	//得到第一个结点的下标
	public int getfirstNeighbor(int index) {
		for(int j=0;j<vertexList.size();j++) {
			if(edges[index][j]>0) {
				return j;
			}
		}
		return -1;
	}
	
	//根据前一个邻接节点的下标获取下一个节点(获取v1除v2之外的邻接点)
	public int getNextneighbor(int v1,int v2) {
		for(int j=v2+1;j<vertexList.size();j++) {
			if(edges[v1][j]>0)
				return j;
		}
		return -1;
	}
	
	//显示图的邻接矩阵
	public void showGraph() {
		for(int[] i:edges) {
			System.out.println(Arrays.toString(i));//形式???
		}
	}
	//深度搜索(存在递归调用)
	public void dfs(boolean[] isvisited,int i) {
		//1.访问输出该节点
		System.out.print(getValueofIndex(i)+"--》");
		//2.设置为已访问
		isvisited[i]=true;
		//3.寻找该节点的第一个邻接点
		int w=getfirstNeighbor(i);
		//4.若w存在
		while(w!=-1) {
		//5.若未被访问过
			if(!isvisited[w]) {
				dfs(isvisited,w);
			}
		//6.若已被访问过
			w=getNextneighbor(i, w);
		}
	}
	
	//重载dfs
	public void dfs() {
		isVisited=new boolean[vertexList.size()];
		for(int i=0;i<getnumofVertex();i++) {
			if(!isVisited[i])
			dfs(isVisited,i);
		}
	}
	
	//广度搜索
	public void bfs(boolean isVisited[],int i) {
		int u;
		int w;
		//存标号
		LinkedList<Integer> queue=new<Integer> LinkedList();
		System.out.print(getValueofIndex(i)+"->");
		isVisited[i]=true;
		queue.addLast(i);//至此处理完成第一任首长
		//以初始点为开始遍历所有点
		while(!queue.isEmpty()) {
			u=queue.removeFirst();
			w=getfirstNeighbor(u);//下一任候选人
			while(w!=-1) {//还存在邻接点,当w=-1,返回大循环,更换前驱
				//若未被访问
				if(!isVisited[w]) {
				  System.out.print(getValueofIndex(w)+"->");	
				  isVisited[w]=true;
				  queue.addLast(w);//下一任首长
				}
				//访问u的另一邻接点,判断是否被访问
				w=getNextneighbor(u,w);
			}
		}
	}
	//重载bfs
	public void bfs() {
	isVisited=new boolean[vertexList.size()];
	for(int i=0;i<vertexList.size();i++) {
		if(!isVisited[i]) {
			bfs(isVisited,i);
		}
	}
	}
	
	public static void main(String[] args) {
		String vertexs[]= {"A","B","C","D","E"};
		Gragh graph=new Gragh(vertexs.length);
		for(String v:vertexs) {
			graph.insertVertex(v);
		}
		graph.insertEdge(0,1,1);
        graph.insertEdge(0,2,1);
        graph.insertEdge(1,2,1);
        graph.insertEdge(1,3,1);
        graph.insertEdge(1,4,1);
        
        graph.showGraph();
       // graph.dfs();
        graph.bfs();
		
	}
	
}

### Java深度优先遍历广度优先遍历的实现 #### 深度优先遍历 (DFS)Java中,深度优先遍历可以通过递归或非递归的方式实现。对于二叉树而言,深度优先遍历主要分为前序遍历、中序遍历以及后序遍历。 - **前序遍历**:访问根节点 -> 遍历左子树 -> 遍历右子树 - **中序遍历**:遍历左子树 -> 访问根节点 -> 遍历右子树 - **后序遍历**:遍历左子树 -> 遍历右子树 -> 访问根节点 以下是使用递归方式实现的后序遍历代码示例: ```java public class BinaryTree { static class TreeNode { int val; TreeNode leftNode; TreeNode rightNode; TreeNode(int x) { val = x; } } // 后序遍历方法 public void postOrderTraversal(TreeNode node) { if (node != null) { postOrderTraversal(node.leftNode); postOrderTraversal(node.rightNode); System.out.print(node.val + " "); } } } ``` 除了递归外,还可以利用栈来模拟递归过程从而达到非递归的效果[^2]。 #### 广度优先遍历 (BFS) 相比之下,广度优先遍历则采用队列结构来进行层次化遍历操作。具体来说是从根节点开始逐层向下扩展直到最后一层的所有结点都被处理完毕为止。下面给出基于队列的数据结构完成此功能的一个简单例子: ```java import java.util.LinkedList; import java.util.Queue; public class BinaryTree { static class TreeNode { int val; TreeNode leftNode; TreeNode rightNode; TreeNode(int x) { val = x; } } // 广度优先遍历方法 public void breadthFirstSearch(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); if(root == null){ return ; } queue.offer(root); while (!queue.isEmpty()) { TreeNode currentNode = queue.poll(); System.out.print(currentNode.val + " "); if (currentNode.leftNode != null) { queue.offer(currentNode.leftNode); } if (currentNode.rightNode != null) { queue.offer(currentNode.rightNode); } } } } ``` 这两种遍历策略的主要差异在于访问次序的不同——前者倾向于尽可能深地探索每一个分支;后者则是按照从上到下的顺序依次考察每一层上的所有节点[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值