广度优先搜索在树中的应用

Posted DataWatching

tags:

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

我们今天先来说明下什么是广度优先搜索,在学算法的过程中,我们无法避免的会学到两种的搜索方式:

(1)广度优先搜索

(2)深度优先搜索

今天我就先来说说广度优先搜索,其实相比较而言,广度优先搜索是比较符合人的思考方式的。

这里举个例子:

如果我们用广度优先搜索的方式来把这个树走一遍的话,那么路径就是这样的:1->3->2->4->5->6;如果这样不好理解,我们就换种表达格式:

->1

->3->2->4

->5->6

这样就要理解了吧,注意:1->4->2->3->6->5;这样其实也是层次遍历。

基本就是这样,如果在树这个数据结构里面,广度优先搜索看起来就是一种逐层次的遍历方式。

树有好几层,广度优先搜索就是一层走完了,再走下一层。

也就是广度优先搜索有点像就是横向遍历,然后,如果这一层遍历完成了,再走到下一层。

说完了什么是广度优先搜索,我们来说说这种遍历是如何实现的:一般来说,要完成广度优先搜索要用到一种数据结构:队列。因为队列有个先入先出(FIFO, First in first out)的性质,在把节点出队的时候,我们把他们的子树的节点入队,这里我们用个例子来说明一下:

102. 二叉树的层次遍历 

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

这里就是典型的树的广度优先搜索的例题了,思路我们都说了,就是用队列来进行实现,把节点再出队的同时,把他们的子树节点入队。接下来我们就来看看具体是如何实现的:

public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) { return res; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { //知道当前在队列中的某层的树的节点的数量。 int size = queue.size(); List<Integer> tempList = new ArrayList<>(); while (size != 0) {        // 节点出队 TreeNode treeNode = queue.poll(); //把树的节点的值加入到临时的list中 tempList.add(treeNode.val); if (treeNode.left != null) {               // 节点入队 queue.offer(treeNode.left); } if (treeNode.right != null) { // 节点入队 queue.offer(treeNode.right); } size--; }        //把树中的某个层的结果集list放入最终结果集中。 res.add(tempList); } return res;}

我在代码中增加了注释,应该是非常容易看懂的。

其实我觉得广度优先搜索是最好理解的思想了,而且实现起来也不难,对新手十分的友好。

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

如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?

树的广度优先搜索(上)

算法-03 | 深度优先DFS| 广度优先BFS

基础扩展 | 16. 队列应用示例:广度优先搜索

挖掘算法中的数据结构:二分搜索树(删除广度优先遍历顺序性)及 衍生算法问题

CS 188 Breadth First Search BFS(广度优先搜索算法)