- 📢前言
- 🌲原題樣例:將有序陣列轉換為二叉搜索樹
- 🌻C#方法:中序遍歷
- 🌻Java 方法一:中序遍歷
- 🌻Java 方法二:中序遍歷,選擇任意一個中間位置數字作為根節點
- 💬總結
- 🚀往期優質文章分享

📢前言
| 🚀 演算法題 🚀 |
- 🌲 每天打卡一道演算法題,既是一個學習程序,又是一個分享的程序😜
- 🌲 提示:本專欄解題 編程語言一律使用 C# 和 Java 兩種進行解題
- 🌲 要保持一個每天都在學習的狀態,讓我們一起努力成為演算法大神吧🧐!
- 🌲 今天是力扣演算法題持續打卡第29天🎈!
| 🚀 演算法題 🚀 |
🌲原題樣例:將有序陣列轉換為二叉搜索樹
給你一個整數陣列 nums ,其中元素已經按 升序 排列,請你將其轉換為一棵 高度平衡 二叉搜索樹,
高度平衡 二叉樹是一棵滿足「每個節點的左右兩個子樹的高度差的絕對值不超過 1 」的二叉樹,
示例 1:

輸入:nums = [-10,-3,0,5,9]
輸出:[0,-3,9,-10,null,5]
解釋:[0,-10,5,null,-3,null,9] 也將被視為正確答案:

示例 2:

輸入:nums = [1,3]
輸出:[3,1]
解釋:[1,3] 和 [3,1] 都是高度平衡二叉搜索樹,
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 按 嚴格遞增 順序排列
🌻C#方法:中序遍歷
關于二叉搜索樹的含義,這里那力扣的解釋來給大家參考看一下


思路決議
中序遍歷,總是選擇中間位置左邊的數字作為根節點
選擇中間位置左邊的數字作為根節點,則根節點的下標為 mid=(left+right)/2,此處的除法為整數除法,
代碼:
public class Solution {
static bool func(TreeNode x, TreeNode y) {
if (x == null) {
return y == null;
}
if (y == null || x.val != y.val) {
return false;
}
return func(x.left, y.right) && func(x.right, y.left);
}
public bool IsSymmetric(TreeNode root) {
return root == null ? true : func(root.left, root.right);
}
}
執行結果
通過
執行用時:92 ms,在所有 C# 提交中擊敗了59.72%的用戶
記憶體消耗:25.1 MB,在所有 C# 提交中擊敗了22.92%的用戶
復雜度分析
時間復雜度:O( n ),其中 n 是陣列的長度,每個數字只訪問一次,
空間復雜度:O(log n ),其中 n 是陣列的長度,空間復雜度不考慮回傳值,因此空間復雜度主要取決于遞回堆疊的深度,遞回堆疊的深度是O(logn),
🌻Java 方法一:中序遍歷
思路決議
總是選擇中間位置左邊的數字作為根節點
選擇中間位置左邊的數字作為根節點,則根節點的下標為 mid=(left+right)/2,此處的除法為整數除法,
代碼:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return helper(nums, 0, nums.length - 1);
}
public TreeNode helper(int[] nums, int left, int right) {
if (left > right) {
return null;
}
// 總是選擇中間位置左邊的數字作為根節點
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = helper(nums, left, mid - 1);
root.right = helper(nums, mid + 1, right);
return root;
}
}
執行結果
通過
執行用時:0 ms,在所有 Java 提交中擊敗了100.00%的用戶
記憶體消耗:38.2 MB,在所有 Java 提交中擊敗了36.59%的用戶
復雜度分析
時間復雜度:O( n ),其中 n 是陣列的長度,每個數字只訪問一次,
空間復雜度:O(log n ),其中 n 是陣列的長度,空間復雜度不考慮回傳值,因此空間復雜度主要取決于遞回堆疊的深度,遞回堆疊的深度是O(logn),
🌻Java 方法二:中序遍歷,選擇任意一個中間位置數字作為根節點
思路決議
選擇任意一個中間位置數字作為根節點,則根節點的下標為mid=(left+right)/2 和 mid=(left+right+1)/2
兩者中隨機選擇一個,此處的除法為整數除法,
代碼:
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.00%的用戶
記憶體消耗:38.3 MB,在所有 Java 提交中擊敗了18.28%的用戶
復雜度分析
時間復雜度:O(n)
空間復雜度:O(log n)
💬總結
- 今天是力扣演算法題打卡的第二十九天!
- 文章采用
C#和Java兩種編程語言進行解題 - 一些方法也是參考力扣大神寫的,也是邊學習邊分享,再次感謝演算法大佬們
- 那今天的演算法題分享到此結束啦,明天再見!

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