- 📢前言
- 🌲原題樣例:二叉樹的最小深度
- 🌻C#方法:深度優先搜索
- 🌻Java 方法一:深度優先搜索
- 🌻Java 方法二:廣度優先搜索
- 💬總結
- 🚀往期優質文章分享

📢前言
| 🚀 演算法題 🚀 |
- 🌲 每天打卡一道演算法題,既是一個學習程序,又是一個分享的程序😜
- 🌲 提示:本專欄解題 編程語言一律使用 C# 和 Java 兩種進行解題
- 🌲 要保持一個每天都在學習的狀態,讓我們一起努力成為演算法大神吧🧐!
- 🌲 今天是力扣演算法題持續打卡第31天🎈!
| 🚀 演算法題 🚀 |
🌲原題樣例:二叉樹的最小深度
給定一個二叉樹,找出其最小深度,
最小深度是從根節點到最近葉子節點的最短路徑上的節點數量,
說明:葉子節點是指沒有子節點的節點,
示例 1:

輸入:root = [3,9,20,null,null,15,7]
輸出:2
示例 2:
示例 2:
輸入:root = [2,null,3,null,4,null,5,null,6]
輸出:5
提示:
- 樹中節點數的范圍在 [0, 105] 內
- -1000 <= Node.val <= 1000
🌻C#方法:深度優先搜索
既然是求解二叉樹的最小深度,那我們就把二叉樹整個遍歷一遍然后判斷深度就好了
使用深度優先搜索的方法,遍歷整棵樹,記錄最小深度,
對于每一個非葉子節點,我們只需要分別計算其左右子樹的最小葉子節點深度,
這樣就將一個大問題轉化為了小問題,可以遞回地解決該問題,
思路決議
代碼:
public class Solution {
public int MinDepth(TreeNode root) {
if (root == null) return 0;
else if (root.left == null) return MinDepth(root.right) + 1;
else if (root.right == null) return MinDepth(root.left) + 1;
else return Math.Min(MinDepth(root.left), MinDepth(root.right)) + 1;
}
}
執行結果
通過
執行用時:272 ms,在所有 C# 提交中擊敗了46.32%的用戶
記憶體消耗:50 MB,在所有 C# 提交中擊敗了50.00%的用戶
復雜度分析
時間復雜度:O( n ),其中 n 是樹的節點數
空間復雜度:O( H ),其中 H 是樹的高度
🌻Java 方法一:深度優先搜索
思路決議
首先可以想到使用深度優先搜索的方法,遍歷整棵樹,記錄最小深度,
對于每一個非葉子節點,我們只需要分別計算其左右子樹的最小葉子節點深度,
這樣就將一個大問題轉化為了小問題,可以遞回地解決該問題,
代碼:
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;
}
}
執行結果
通過
執行用時:6 ms,在所有 Java 提交中擊敗了60.65%的用戶
記憶體消耗:59 MB,在所有 Java 提交中擊敗了16.41%的用戶
復雜度分析
時間復雜度:O( n ),其中 n 是樹的節點數
空間復雜度:O( H ),其中 H 是樹的高度
🌻Java 方法二:廣度優先搜索
思路決議
同樣,我們可以想到使用廣度優先搜索的方法,遍歷整棵樹,
當我們找到一個葉子節點時,直接回傳這個葉子節點的深度,
廣度優先搜索的性質保證了最先搜索到的葉子節點的深度一定最小,
代碼:
class Solution {
class QueueNode {
TreeNode node;
int depth;
public QueueNode(TreeNode node, int depth) {
this.node = node;
this.depth = depth;
}
}
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
Queue<QueueNode> queue = new LinkedList<QueueNode>();
queue.offer(new QueueNode(root, 1));
while (!queue.isEmpty()) {
QueueNode nodeDepth = queue.poll();
TreeNode node = nodeDepth.node;
int depth = nodeDepth.depth;
if (node.left == null && node.right == null) {
return depth;
}
if (node.left != null) {
queue.offer(new QueueNode(node.left, depth + 1));
}
if (node.right != null) {
queue.offer(new QueueNode(node.right, depth + 1));
}
}
return 0;
}
}
執行結果
通過
執行用時:1 ms,在所有 Java 提交中擊敗了99.43%的用戶
記憶體消耗:58 MB,在所有 Java 提交中擊敗了58.59%的用戶
復雜度分析
時間復雜度:O(n)其中 n 是樹的節點數
空間復雜度:O(n)其中 n 是樹的節點數
💬總結
- 今天是力扣演算法題打卡的第三十一天!
- 文章采用
C#和Java兩種編程語言進行解題 - 一些方法也是參考力扣大神寫的,也是邊學習邊分享,再次感謝演算法大佬們
- 那今天的演算法題分享到此結束啦,明天再見!

🚀往期優質文章分享
- ??Unity零基礎到入門 | 游戲引擎 Unity 從0到1的 系統學習 路線【全面總結-建議收藏】!
- 🧡花一天時間做一個高質量飛機大戰游戲,過萬字Unity完整教程!漂亮學妹看了直呼666!
- 💛回憶童年和小伙伴一起玩過的經典游戲【炸彈人小游戲】制作程序+決議
- 💚通宵一晚做出來的一款類似CS的第一人稱射擊游戲Demo!原來做游戲也不是很難
- 🤍爆肝整整一個周末寫一款類似 皇室戰爭 的 即時戰斗類 游戲Demo!兩萬多字游戲制作程序+決議!
- 💙一款類似“恐龍快打”的 橫版街機格斗游戲 該如何制作?| 一起來學習 順便送原始碼【碼文不易,建議收藏學習】
- 💜【超實用技巧】| 提高寫文的質量 和 速率必學技能: Typora 圖床配置 詳細說明
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300556.html
標籤:其他
