BFS解决二叉树的最小高度(2021-7-10)
BFS解决二叉树的最小高度
2021-7-10打卡LeetCode的第111题,求二叉树的最小高度的问题,这个题本身不难,我们更想的是通过这个题来了解BFS算法,也就是我们所说的广度遍历,更要明白的是这个题我们为什么要用BFS去完成它,先上题。
题目分析
计算二叉树的最小的高度,言外之意是我们从二叉树的根节点开始向下找到它的深度最小叶子节点,然后看这个叶子节点在树的第几层即可。所以我们需要遍历这棵树,把那个深度最小的叶子节点找出来,那么问题来了,遍历树的方法有深度遍历(DFS)也就是我们所说的递归,还有一个就是我们今天要说的广度遍历(BFS),也就是所谓的迭代。
BFS的简介
广度遍历嘛,一听这个名字就知道这个算法时横向扩散,对应二叉树的意思就是,我要一层层的遍历你二叉树,那么我们怎么一层一层的遍历呢?这就要用到迭代的思想了,而迭代要用到的数据结构是队列,怎么去迭代放在阶梯思路里说,这里说一下我们为什么用BFS而不用DFS,DFS是递归,它要把每一条路走到底了,才会去走下一条路,你走通一条还不行,你要把所有的路都走一遍,然后比较,那一条路更短。而BFS则不同,它是一层层的遍历啊,只要我遍历到你那一层有一个节点它没有左右节点,我就找到答案了,是不是在这种情况下BFS是不二选择。
思路
既然我们知道了呀欧式BFS去广度遍历,那么怎么去做,才能做到一层层的遍历呢,这样的当我们在树的某一层的时候,我们要使这一层所有的节点都要在队列中,当他出队列时要把它下一层的左右孩子节点添加进来,如果他左右孩子节点都不存在,那么不就找到答案了嘛。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int minDepth(TreeNode root) {
if(root==null) return 0;
//迭代哟啊用到的队列
LinkedList<TreeNode> queue=new LinkedList<>();
//跟节点入队
queue.offer(root);
//跟节点入队说明树的高度已经为1了
int depeth=1;
//当队列不为空的时候,我们就要把树某一层节点从队列拿出来,存储下一层节点
while(!queue.isEmpty()){
int length=queue.size();
//当前这一层的节点出队,这个length用的有点妙
for(int i=length;i>0;i--){
TreeNode node=queue.poll();
//如果某一个节点的左右孩子为null,说明找到那个叶子节点啦
if(node.right==null&&node.left==null){
return depeth;
}
//左孩子入队
if(node.right!=null){
queue.offer(node.right);
}
//右孩子入队
if(node.left!=null){
queue.offer(node.left);
}
}
//出队完一层深度+1
depeth++;
}
return depeth;
}
}
总结
做完这个题我清楚的指导BFS底层用到的数据结构,以及BFS怎么去一层层的迭代,记住这个模板,迭代可以套用这个模板,这个模板是我白嫖过来的。更重要的一点就是什么情况下我们用BFS去解决问题,那就是寻找最短路径等等有时候就可考虑可不可以用到它。