[LeetCode] #108 Convert Sorted Array to Binary Search Tree 解題
題型解說
這是一題難度為簡單的題目
需要設計一個方法,此方法會傳入一個排序好的陣列 nums
回傳一顆平衡的二元搜尋樹,左右兩邊的層級不能超過 1
解題思路
二元搜尋樹有幾個特性
- 不會有重複的值
- 左節點數值一定比根節點數值小
- 右節點數值一定比根節點數值大
- 其他層的節點也要符合以上要求
既然所有的右邊節點一定比根節點大,所有左邊節點一定比根節點小,題目也規定兩邊的層數不能相差超過 1
那麼根節點只能選 nums 的中間值,這邊有個小疑問「如果 nums 是偶數呢?」,是要選左邊那個還是右邊那個?
答案其實無所謂,因為題目有提示說答案不止一種
根節點選擇好了後就能把 nums 拆成左右兩部分,左右兩部分也需要符合 二元搜尋樹 的特性
那一樣選擇中間值拆左右兩部分,所以分析後最適合的解法就是二分搜尋法了
程式碼
Java
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if (nums.length == 0) {
return null;
}
return sortedArrayToBST(nums, 0, nums.length);
}
private TreeNode sortedArrayToBST(int[] nums, int left, int right) {
if (left == right) {
return null;
}
int mid = (left + right) /2;
TreeNode node = new TreeNode(nums[mid]);
node.left = sortedArrayToBST(nums, left, mid);
node.right = sortedArrayToBST(nums, mid +1, right);
return node;
}
}
class Solution { // 其他人的二分搜尋法
public TreeNode sortedArrayToBST(int[] nums) {
int length = nums.length;
return generateTree(nums, 0, length - 1);
}
private TreeNode generateTree(int[] nums, int low, int high) {
if (low > high) {
return null;
}
int mid = low + (high - low) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = generateTree(nums, low, mid - 1);
root.right = generateTree(nums, mid + 1, high);
return root;
}
}