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

📢前言
| 🚀 演算法題 🚀 |
- 🌲 每天打卡一道演算法題,既是一個學習程序,又是一個分享的程序😜
- 🌲 提示:本專欄解題 編程語言一律使用 C# 和 Java 兩種進行解題
- 🌲 要保持一個每天都在學習的狀態,讓我們一起努力成為演算法大神吧🧐!
- 🌲 今天是力扣演算法題持續打卡第28天🎈!
| 🚀 演算法題 🚀 |
🌲原題樣例
給定一個二叉樹,找出其最大深度,
二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數,
說明: 葉子節點是指沒有子節點的節點,
示例:
給定二叉樹` [3,9,20,null,null,15,7]`
3
/ \
9 20
/ \
15 7
回傳它的最大深度 3 ,
🌻C#方法:深度優先搜索
思路決議
該題是要求二叉樹的最大深度,我們可以先求出左子樹和右子樹的深度 l 和 r
那就可以計算出二叉樹的最大深度了:max( l,r )+1
而左子樹和右子樹的最大深度又可以以同樣的方式進行計算,
因此我們可以用「深度優先搜索」的方法來計算二叉樹的最大深度,
具體而言,在計算當前二叉樹的最大深度時,可以先遞回計算出其左子樹和右子樹的最大深度,然后在 O(1) 時間內計算出當前二叉樹的最大深度,遞回在訪問到空節點時退出,
代碼:
public class Solution {
public int MaxDepth(TreeNode root)
{
//遞回終止情況:節點為空
if (root == null)
{
return 0;
}
else
{
int leftDepth = MaxDepth(root.left);
int rightDepth = MaxDepth(root.right);
return Math.Max(leftDepth, rightDepth) + 1;
}
}
}
執行結果
通過
執行用時:100 ms,在所有 C# 提交中擊敗了43.46%的用戶
記憶體消耗:25.7 MB,在所有 C# 提交中擊敗了10.73%的用戶
復雜度分析
時間復雜度:O(n)
空間復雜度:O(n)
🌻Java 方法一:深度優先搜索
思路決議
該題是要求二叉樹的最大深度,我們可以先求出左子樹和右子樹的深度 l 和 r
那就可以計算出二叉樹的最大深度了:max( l,r )+1
而左子樹和右子樹的最大深度又可以以同樣的方式進行計算,
因此我們可以用「深度優先搜索」的方法來計算二叉樹的最大深度,
具體而言,在計算當前二叉樹的最大深度時,可以先遞回計算出其左子樹和右子樹的最大深度,然后在 O(1) 時間內計算出當前二叉樹的最大深度,遞回在訪問到空節點時退出,
代碼:
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
} else {
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
return Math.max(leftHeight, rightHeight) + 1;
}
}
}
執行結果
通過
執行用時:0 ms,在所有 Java 提交中擊敗了100.00%的用戶
記憶體消耗:38.3 MB,在所有 Java 提交中擊敗了56.45%的用戶
復雜度分析
時間復雜度:O( n )其中 n 為二叉樹節點的個數,每個節點在遞回中只被遍歷一次,
空間復雜度:O( height ) 其中height 表示二叉樹的高度,遞回函式需要堆疊空間,而堆疊空間取決于遞回的深度,因此空間復雜度等價于二叉樹的高度,
🌻Java 方法二:廣度優先搜索
思路決議
也可以用「廣度優先搜索」的方法來解決這道題目,但我們需要對其進行一些修改,此時我們廣度優先搜索的佇列里存放的是「當前層的所有節點」,
每次拓展下一層的時候,不同于廣度優先搜索的每次只從佇列里拿出一個節點,我們需要將佇列里的所有節點都拿出來進行拓展,這樣能保證每次拓展完的時候佇列里存放的是當前層的所有節點,即我們是一層一層地進行拓展,最后我們用一個變數ans 來維護拓展的次數,該二叉樹的最大深度即為ans,
代碼:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = 0, p2 = 0;
int[] sorted = new int[m + n];
int cur;
while (p1 < m || p2 < n) {
if (p1 == m) {
cur = nums2[p2++];
} else if (p2 == n) {
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for (int i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
}
}
執行結果
通過
執行用時:1 ms,在所有 Java 提交中擊敗了19.10%的用戶
記憶體消耗:38.3 MB,在所有 Java 提交中擊敗了60.95%的用戶
復雜度分析
時間復雜度:O(n),其中 nn 為二叉樹的節點個數,與方法一同樣的分析,每個節點只會被訪問一次,
空間復雜度:O(n),此方法空間的消耗取決于佇列存盤的元素數量,其在最壞情況下會達到 O(n),
💬總結
- 今天是力扣演算法題打卡的第二十八天!
- 文章采用
C#和Java兩種編程語言進行解題 - 一些方法也是參考力扣大神寫的,也是邊學習邊分享,再次感謝演算法大佬們
- 那今天的演算法題分享到此結束啦,明天再見!

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