[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,一经查实,立即删除!

相关文章

75 jsp基础语法汇总

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

[递归]一文看懂递归

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

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

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

3.项目的基本概念

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

[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如何让进行项目管理

项目管理分为五个过程组

第一章 概率论的基本概念

概率论与数理统计的学习内容来源于中国大学MOOC&#xff0c;以及参考书籍《概率论与数理统计》第四版&#xff0c;浙江大学。 随机现象  在一定条件下&#xff0c;有可能出现多种结果&#xff1b;而且在事情发生前不能知道结果。 随机试验  概念&#xff1a;对随机现象的…

【知识导图】数据结构与算法

[基础知识点] 10 个数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树&#xff1b; 10 个算法&#xff1a;递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 [学习技巧] 学习它的“来历”“…

第三十七期:刷脸支付叫好不叫座,为啥消费者和商家都不愿用先进科技?

移动支付相信大多数人都不陌生&#xff0c;中国移动支付的普及被人称为“新四大发明”&#xff0c;在中国移动支付产品发展如火如荼的今天&#xff0c;刷脸支付成为了新的时尚&#xff0c;然而这个时尚的支付方式却显得叫好不叫座&#xff0c;刷脸支付的问题到底出在哪了? 移动…

第二章 随机变量

随机变量  目标&#xff1a;将实验结果数量化。实验结构有数字型和非数字型。数字型&#xff1a;降雨量、上车人数等。非数字型&#xff1a;晴天/阴天/下雨、化验结果阴性/阳性等。  定义&#xff1a;随机试验样本空间S&#xff0c;如果XX(e)为定义在S上的实数单值函数&…

[Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]

【问题描述】[困难] 【解答思路】 1. 堆 复杂度 class Solution {public int[] smallestRange(List<List<Integer>> nums) {//区间的左边和右边int rangeLeft 0, rangeRight Integer.MAX_VALUE;//最小范围int minRange rangeRight - rangeLeft;//区间的左边最…

第十期:过去50年间,十大热门语言及发明者大盘点

本文收集了十大热门编程语言背后的程序员和设计者的名字和大家分享。以下是十大热门编程语言及其创建者&#xff0c;排名不分先后。 软件领域有许多编程语言&#xff0c;每年还涌现出越来越的新语言。新发布的语言有Scala、Kotlin、Go和Closure&#xff0c;但历史证明&#xff…

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用 攻击成果 主动攻击的实践 ms17010eternalblue payload windows/x64/meterpreter/reverse_tcp&#xff08;成功&#xff09;payload generic/shellreversetcp&#xff08;成功&#xff09;ms17010psexec&#xff08;成功且…

【数据结构与算法】复杂度分析

一、什么是复杂度分析&#xff1f; 1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 3.分别用时间复杂度和空间复杂度两个概念来描述性能问题&#xff0c;二者统称为复杂度。 4.复杂…

第十一期:30秒内便能学会的30个实用Python代码片段

许多人在数据科学、机器学习、web开发、脚本编写和自动化等领域中都会使用Python&#xff0c;它是一种十分流行的语言。 Python流行的部分原因在于简单易学。 本文将简要介绍30个简短的、且能在30秒内掌握的代码片段。 1. 唯一性 以下方法可以检查给定列表是否有重复的地方&…

[Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]

【问题描述】[中等] 【解答思路】 1. 前序遍历 将二叉树展开为单链表之后&#xff0c;单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此&#xff0c;可以对二叉树进行前序遍历&#xff0c;获得各节点被访问到的顺序。 由于将二叉树展开为链表之后会破坏二叉树的…