图的广度与深度优先遍历(Java)

一、图的广度(宽度)优先遍历 定义:其实就是离源节点近的节点先输出,远的节点后输出。图的广度优先遍历是依靠队列来实现的。 import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; /** * 图的广度优先遍历(BFS): * 是使用队列这个数据结构来完成的 * 逻辑实现:我们先构建一个队列,先把源节点进入队列,然后把它下面的所有next节点都进入队列,然后源节点弹出队列并打印 * 然后队列的第一个节点的所有next进入队列,然后该节点弹出就打印,依次类推,直至弹出所有节点(要注意的是,因为一个节点可能是不同节点的next,所以,我们设置一个set集合 * 目的就是不让已经进入队列的节点再次进入队列)直至队列为空 * @author zhmm * */ public class BFS {

public static void bfs(Node node) { if (node == null) { return; } Queue<Node> queue = new LinkedList<>(); HashSet<Node> map = new HashSet<>(); queue.add(node); map.add(node); while (!queue.isEmpty()) { Node cur = queue.poll(); System.out.println(cur.value); for (Node next : cur.nexts) { if (!map.contains(next)) { map.add(next); queue.add(next); } } } }

} 二、深度优先遍历 import java.util.HashSet; import java.util.Stack; /** * 深度优先遍历(DFS) * 深度优先遍历的概念:其实就是这个图的所有节点的可达的路径都走完,才会回到父节点再走其它的路。它的实现是用栈这个数据结构来完成的 * 逻辑实现:首先是把源节点放到栈里和set里,并打印,然后弹出源节点,如果遍历源节点的所有next节点,如果当前next节点没有加入到set里,那么把源节点重新加入到栈里,这个 * next加入到栈里,并加入set集合中,打印该next,并跳出循环,把当前next变为当前节点(也就是栈顶元素),重复上面的操作,就会的得到一个深度优先遍历的序列 * 注:深度优先遍历的结果可能不唯一,这与从哪个next开始有关 * @author zhmm * */ public class DFS {

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)) { stack.push(cur); stack.push(next); set.add(next); System.out.println(next.value); break; } } } }

}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_32595453/article/details/80737706
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞