广度优先搜索

Posted 浮云神码

tags:

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

        广度优先搜索,BFS,其英文全称是Breadth First Search。BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)


    本系列主要是解决LeetCode上关于广度优先搜索的算法题型。采取的方式是直接使用代码来描述问题的解决思路,需要读者具有一定的经验,了解基本的数据结构。


Talk is cheap, show me the code!


import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;
/** * https://leetcode-cn.com/problems/binary-tree-level-order-traversal/ * 102. 二叉树的层序遍历 * 难度 中等 * 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。 * * 示例: * 二叉树:[3,9,20,null,null,15,7], * * 3 * / \ * 9 20 * / \ * 15 7 * 返回其层序遍历结果: * * [ * [3], * [9,20], * [15,7] * ] * * 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal */public class LevelOrderTree {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>(); // 防御性编程 if (root == null) { return result; } // 广度优先搜索 借助【队列】来实现 Queue<TreeNode> queue = new LinkedList<>(); // 使用root初始化队列 queue.add(root);
while (!queue.isEmpty()) { /** * size为当前队列的长度(即当前层级的元素个数), 有以下两个作用 * 1. 设置存储最终结果的List的长度 * 2. 决定for循环的次数, 初始长度决定了本次while循环应该获取多少个元素 */ int size = queue.size(); // 存储当前层级节点的值列表 List<Integer> currentLevelList = new ArrayList<>(size); for (int i = 0; i < size; i++) { TreeNode current = queue.remove(); // 将当前元素的左右子节点依次加入队列, 实现从左到右访问 if (current.left != null) { queue.add(current.left); } if (current.right != null) { queue.add(current.right); } currentLevelList.add(current.val); } result.add(currentLevelList); }
return result; }}


以上是关于广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

Prolog中的广度优先搜索

面试题算法: 广度优先搜索

图相关算法

图解:深度优先搜索与广度优先搜索

广度优先搜索遍历图

无向图 广度优先搜索 和 深度优先搜索