广度优先搜索在树中的应用
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;
}
我在代码中增加了注释,应该是非常容易看懂的。
其实我觉得广度优先搜索是最好理解的思想了,而且实现起来也不难,对新手十分的友好。
以上是关于广度优先搜索在树中的应用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?