- 📢前言
- 🌲原題樣例
- 🌻C#方法:遞回
- 🌻Java 方法一:遞回
- 🌻Java 方法二:雙指標
- 💬總結
- 🚀往期優質文章分享

📢前言
| 🚀 演算法題 🚀 |
- 🌲 每天打卡一道演算法題,既是一個學習程序,又是一個分享的程序😜
- 🌲 提示:本專欄解題 編程語言一律使用 C# 和 Java 兩種進行解題
- 🌲 要保持一個每天都在學習的狀態,讓我們一起努力成為演算法大神吧🧐!
- 🌲 今天是力扣演算法題持續打卡第25天🎈!
| 🚀 演算法題 🚀 |
🌲原題樣例
給定一個二叉樹的根節點 root,回傳它的 中序 遍歷,
示例 1:

輸入:root = [1,null,2,3]
輸出:[1,3,2]
示例 2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [1]
輸出:[1]
示例 4:

輸入:root = [1,2]
輸出:[2,1]
示例 5:

輸入:root = [1,null,2]
輸出:[1,2]
提示:
- 樹中節點數目在范圍 [0, 100] 內
- -100 <= Node.val <= 100
🌻C#方法:遞回
思路決議
根據題意我們知道,最終目的就是二叉樹的中序遍歷
二叉樹的中序遍歷:按照訪問左子樹——根節點——右子樹的方式遍歷這棵樹,而在訪問左子樹或者右子樹的時候我們按照同樣的方式遍歷,直到遍歷完整棵樹,
因此整個遍歷程序天然具有遞回的性質,我們可以直接用遞回函式來模擬這一程序,
代碼:
public class Solution {
public IList<int> InorderTraversal(TreeNode root) {
List<int> list = new List<int>();
function(root);
return list;
void function(TreeNode root)
{
if(root==null)
return ;
if (root.left == null)
{
list.Add(root.val);
function(root.right);//在左邊節點不存在且自身已插入的情況下查找右邊節點
return;
}
function(root.left); //優先查找root左邊節點
list.Add(root.val); //插入root自身
function(root.right);//最后查找root右邊節點
}
}
}
執行結果
通過
執行用時:220 ms,在所有 C# 提交中擊敗了87.01%的用戶
記憶體消耗:30.7 MB,在所有 C# 提交中擊敗了5.29%的用戶
復雜度分析
時間復雜度:O( n)
空間復雜度:O(1)
🌻Java 方法一:遞回
思路決議
首先我們需要了解什么是二叉樹的中序遍歷:按照訪問左子樹——根節點——右子樹的方式遍歷這棵樹,而在訪問左子樹或者右子樹的時候我們按照同樣的方式遍歷,直到遍歷完整棵樹,
因此整個遍歷程序天然具有遞回的性質,我們可以直接用遞回函式來模擬這一程序,
定義 inorder(root) 表示當前遍歷到 root 節點的答案,那么按照定義,我們只要遞回呼叫 inorder(root.left) 來遍歷 root 節點的左子樹,然后將 root 節點的值加入答案,再遞回呼叫inorder(root.right) 來遍歷 root 節點的右子樹即可,遞回終止的條件為碰到空節點,
代碼:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
inorder(root, res);
return res;
}
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
}
執行結果
通過
執行用時:0 ms,在所有 Java 提交中擊敗了100.00%的用戶
記憶體消耗:36.9 MB,在所有 Java 提交中擊敗了5.24%的用戶
復雜度分析
時間復雜度:O(n)
空間復雜度:O(n)
🌻Java 方法二:雙指標
思路決議
方法一的遞回函式我們也可以用迭代的方式實作,兩種方式是等價的,區別在于遞回的時候隱式地維護了一個堆疊,而我們在迭代的時候需要顯式地將這個堆疊模擬出來,其他都相同,具體實作可以看下面的代碼,
代碼:
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];
}
}
}
執行結果
通過
執行用時:0 ms,在所有 Java 提交中擊敗了100%的用戶
記憶體消耗:36.8 MB,在所有 Java 提交中擊敗了13.83%的用戶
復雜度分析
時間復雜度:O(n)
空間復雜度:O(n)
💬總結
- 今天是力扣演算法題打卡的第二十五天!
- 文章采用
C#和Java兩種編程語言進行解題 - 一些方法也是參考力扣大神寫的,也是邊學習邊分享,再次感謝演算法大佬們
- 那今天的演算法題分享到此結束啦,明天再見!

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