【題目】面試題 04.02. 最小高度樹
給定一個有序整數數組,元素各不相同且按升序排列,編寫一個算法,創建一棵高度最小的二叉搜索樹。
示例:
給定有序數組: [-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:
0
/ \
-3 9
/ /
-10 5
【解題思路1】二分法 + 遞歸
取數組中間的數建立根節點root,然後以中間爲分界,將左邊的子數組和右邊的子數組分別進行遞歸
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
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 node = new TreeNode(nums[mid]);
node.left = helper(nums, left, mid - 1);
node.right = helper(nums, mid + 1, right);
return node;
}
}
調用Arrays.copyOfRange()再遞歸
Arrays.copyOfRange(int[ ] nums, int from, int to)
將一個原始的數組nums,從下標from開始複製,複製到上標to(不包括to),生成一個新的數組。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) return null; //數組裏沒有元素了,即到了葉子節點
TreeNode node = new TreeNode(nums[nums.length / 2]); //取數組的中間的值爲根
node.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, nums.length / 2)); //數組前半段
node.right = sortedArrayToBST(Arrays.copyOfRange(nums, nums.length / 2 + 1, nums.length));//後半段
return node;
}
}