leetcode 面試題 04.02. 最小高度樹

【題目】面試題 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章