【图】图的深度优先和宽度优先遍历

本文介绍了图的两种遍历方法——宽度优先遍历(BFS)和深度优先遍历(DFS)。BFS使用队列进行节点的访问,确保先访问距离起点近的节点;DFS则采用栈,可以深入探索图的某一分支。两种遍历方法在处理可循环图时,都需要借助Set来避免重复访问节点。示例代码展示了如何实现这两种遍历策略。
摘要由CSDN通过智能技术生成

图的学习

宽度优先遍历

图的bfs要准备一个Set,因为图可能是可循环的。遍历方法如下

  • 队列弹出就打印
  • 它的直接邻居,没有进入过Set的就进队列和Set
// 从node出发,进行宽度优先遍历
public static void bfs(Node start) {
	if (start == null) {
		return;
	}
	Queue<Node> queue = new LinkedList<>();
	HashSet<Node> set = new HashSet<>();
	queue.add(start);
	set.add(start);
	while (!queue.isEmpty()) {
		Node cur = queue.poll();
		System.out.println(cur.value);
		for (Node next : cur.nexts) {
			if (!set.contains(next)) {
				set.add(next);
				queue.add(next);
			}
		}
	}
}

深度优先遍历

public static void dfs(Node node) {
	if (node == null) {
		return;
	}
	Stack<Node> stack = new Stack<>();
	HashSet<Node> set = new HashSet<>();
	stack.add(node);
	set.add(node);
	//入栈的时候就打印
	System.out.println(node.value);
	while (!stack.isEmpty()) {
		Node cur = stack.pop();//弹出节点
		for (Node next : cur.nexts) {//枚举子节点
			if (!set.contains(next)) {//如果set中不包含next
				stack.push(cur);//把父节点重新压入栈
				stack.push(next);//压入子节点
				set.add(next);//set记录子节点
				System.out.println(next.value);//压入栈时候打印
				break;//退出循环
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值