1. 程式人生 > >LeetCode:108. 將有序陣列轉換為二叉搜尋樹(Java)

LeetCode:108. 將有序陣列轉換為二叉搜尋樹(Java)

題目:

將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

給定有序陣列: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹:

      0
     / \
   -3   9
   /   /
 -10  5

解答:

這個題有點類似二分查詢,根節點在正中間,左子樹的根節點在左邊一半陣列的正中間,右子樹的根節點在右邊一半陣列的正中間;於是可以遞迴解決:先確定根節點,然後構造左子樹,然後構造右子樹, 結束條件類似二分查詢(low > high)。

/**
 * 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 == null) {
            return null;
        }
        return convertTree(nums, 0, nums.length - 1);
    
    }
    private TreeNode convertTree(int[] nums, int l, int r) {//l:陣列左邊;r:陣列右邊,包括l和r
        if (l <= r) {
            int mid = (l + r) / 2;
            TreeNode newNode = new TreeNode(nums[mid]);
            newNode.left = convertTree(nums, l, mid - 1);
            newNode.right = convertTree(nums, mid + 1, r);
            return newNode;
        }
        else {
            return null;
        }
    }
}