[Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

【问题描述】[简单]

在这里插入图片描述

【解答思路】

1. 递归

自下而上
基本情况/结束条件 :
叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点
当 root 节点左右孩子都为空时,返回 1
当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度
当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值

递推关系:遍历二叉树

复杂度
在这里插入图片描述

class Solution {public int minDepth(TreeNode root) {if(root == null) return 0;//这道题递归条件里分为三种情况//1.左孩子和有孩子都为空的情况,说明到达了叶子节点,直接返回1即可if(root.left == null && root.right == null) return 1;//2.如果左孩子和由孩子其中一个为空,那么需要返回比较大的那个孩子的深度        int m1 = minDepth(root.left);int m2 = minDepth(root.right);//这里其中一个节点为空,说明m1和m2有一个必然为0,所以可以返回m1 + m2 + 1;if(root.left == null || root.right == null) return m1 + m2 + 1;//3.最后一种情况,也就是左右孩子都不为空,返回最小深度+1即可return Math.min(m1,m2) + 1; }
}

代码可以进行简化,当左右孩子为空时 m1和 m2 都为 0,可以和情况 2 进行合并,即返回 m1+m2+1

class Solution {public int minDepth(TreeNode root) {if(root == null) return 0;int m1 = minDepth(root.left);int m2 = minDepth(root.right);//1.如果左孩子和右孩子有为空的情况,直接返回m1+m2+1//2.如果都不为空,返回较小深度+1return root.left == null || root.right == null ? m1 + m2 + 1 : Math.min(m1,m2) + 1;}
}
class Solution {public int minDepth(TreeNode root) {if (root == null) {return 0;}if ((root.left == null) && (root.right == null)) {return 1;}int min_depth = Integer.MAX_VALUE;if (root.left != null) {min_depth = Math.min(minDepth(root.left), min_depth);}if (root.right != null) {min_depth = Math.min(minDepth(root.right), min_depth);}return min_depth + 1;}
}
2. BFS广度优先遍历

一个优化的方法是利用广度优先搜索,我们按照树的层去迭代,第一个访问到的叶子就是最小深度的节点,这样就不用遍历所有的节点了。
1.特判
2.root入队 ,左右节点非空入队
3.找到第一个左右节点均为空的节点即是答案

时间复杂度:O(N) 空间复杂度:O(N)
在这里插入图片描述

  public int minDepth(TreeNode root) {if (root == null)return 0;Queue<TreeNode> queue = new LinkedList<>();queue.add(root);//入队int level = 0;while (!queue.isEmpty()) {//队列不为空就继续循环level++;int levelCount = queue.size();for (int j = 0; j < levelCount; j++) {TreeNode node = queue.poll();//出队//如果当前node节点的左右子树都为空,直接返回level即可if (node.left == null && node.right == null)return level;if (node.left != null)queue.add(node.left);if (node.right != null)queue.add(node.right);}}return -1;}

【总结】

1. 相关题目

[Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

2.递归

在实现递归函数之前,有两件重要的事情需要弄清楚:

递推关系:一个问题的结果与其子问题的结果之间的关系。
基本情况:不需要进一步的递归调用就可以直接计算答案的情况。可理解为递归跳出条件。
一旦我们计算出以上两个元素,再想要实现一个递归函数,就只需要根据递推关系调用函数本身,直到其抵达基本情况。

3.递归模板套路

递归模板套路
由下到上
在这里插入图片描述

有上到下
在这里插入图片描述
区别
在这里插入图片描述

参考链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/li-jie-zhe-dao-ti-de-jie-shu-tiao-jian-by-user7208/
参考链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/solution/java-di-gui-he-fei-di-gui-liang-chong-fang-shi-de-/
递归学习资料:https://leetcode-cn.com/circle/article/koSrVI/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PAT 1009 说反话

#include<cstdio>#include<cstring>#include<iostream>using namespace std;typedef long long ll;char a[82][82];int cnt;int main(){while(scanf("%s",a[cnt])!EOF){cnt;//***** 由于这里把cnt放到上面的判断中去了导致 最后在判断EOF的时候多判…

75 jsp基础语法汇总

JSP语法 脚本程序 脚本程序可以包含任意量量的Java语句句、变量量、⽅方法或表达式&#xff0c;只要它们在脚本语⾔言 中是有效的。 脚本程序的语法格式&#xff1a; <% 代码⽚片段 %>或者&#xff0c;您也可以编写与其等价的XML语句句&#xff0c;就像下⾯面这样&#…

CodeVS 1300 文字排版 线性DP

1300 文件排版 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 写电子邮件是有趣的&#xff0c;但不幸的是经常写不好看&#xff0c;主要是因为所有的行不一样长&#xff0c;你的上司想要发排版精美的电子邮件&#xff0c;你的任务是为他编写一个电子邮件排版程序…

[递归]一文看懂递归

1. 递归的定义 编程语言中&#xff0c;函数 Func(Type a,……) 直接或间接调用函数本身&#xff0c;则该函数称为「递归函数」。 在实现递归函数之前&#xff0c;有两件重要的事情需要弄清楚: 递推关系&#xff1a;一个问题的结果与其子问题的结果之间的关系。基本情况&…

centos6.8 安装软件

1.安装jdk1.8 https://blog.csdn.net/zhengjinyou/article/details/80890893 2.安装tomcat8.5 https://www.cnblogs.com/jimboi/p/6405136.html 3.安装nginx https://www.cnblogs.com/vurtne-lu/p/7010065.html nginx: unrecognized service问题解决 https://blog.csdn.ne…

随机

随机数发生器 线性同余 x(i1)Axi%Mx0需要指定&#xff0c;称为种子。如果M11&#xff0c;A7&#xff0c;x01&#xff0c;那么所生成的数为7,5,2,3,10,4,6,9,8,1,7,5,2… 这个序列的周期为M-1。如果M231−1&#xff0c;这个周期应该对大多数应用来说应该够了。

Serval and Parenthesis Sequence CodeForces - 1153C 贪心

题意&#xff1a;给出一个由"(",")","?"三种字符构成的序列&#xff0c;让我们把其中的问号替换成左右括号&#xff0c;使得整个序列变成一个完整地括号序列&#xff0c;也就是括号匹配正确&#xff0c;而且要求不能提前结束的括号序列&#xf…

[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]

【问题描述】[简单] 【解答思路】 1. 递归 自底向上 基本条件/终止条件&#xff1a;当前节点或者下一个节点null 递推关系&#xff1a; head.next.next head 在函数内部&#xff0c;改变节点的指向&#xff0c;也就是 head 的下一个节点指向 head 递归函数那句 时间…

3.项目的基本概念

项目的基本概念 项目及其特征

python之各种装饰器的使用

"""    装饰器&#xff0c;带参数的装饰器&#xff0c;类的装饰器    判断是否为可迭代的    from collections import Iterable    print(isinstance([1,2,3],Iterable))    """    # 1、简单的装饰器    def debu…

[剑指offer]面试题第[1]题[JAVA][二维数组中的查找][数组][二分]

【问题描述】 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含…

[CodeForces-1138B] *Circus 解方程|数学

题意&#xff1a;有两场表演&#xff0c;n个艺术家&#xff0c;根据规则找出我们要挑选的人的编号&#xff0c;输出编号。 规则1 保证每个人只能参加一场表演&#xff0c;也就是同一个艺术家不能出现在两场表演中 规则2 两场表演参演的艺术家的数量是相同的 规则3 第一场可以…

概率论与数理统计

记录概率论与数理统计的笔记。课程是中国大学MOOC 浙江大学的《概率论与数理统计》课程。 本系列所有内容来源于&#xff1a;概率论与数理统计的学习内容来源于中国大学MOOC&#xff0c;以及参考书籍《概率论与数理统计》第四版&#xff0c;浙江大学。 必然的、确定性的事件…

[Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]

【问题描述】[简单] 【解答思路】 1. 逐个查找 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int findMagicIndex(int[] nums) {for (int i 0, length nums.length; i < length; i) {if (i nums[i])return i;}return -1;}2. 逐个查找优化 有序升序…

5如何让进行项目管理

项目管理分为五个过程组

python练习题-day25

class Person:  __key123def __init__(self,username,password):self.usernameusernameself.__passwordpassworddef __get_pwd(self):return self.__passworddef login(self):self.__get_pwd() alexPerson("alex","alex3714") print(alex._Person__passw…