50 Maximum Binary Tree

題目

Given an integer array with no duplicates. A maximum tree building on this array is defined as follow:

The root is the maximum number in the array.
The left subtree is the maximum tree constructed from left part subarray divided by the maximum number.
The right subtree is the maximum tree constructed from right part subarray divided by the maximum number.

Construct the maximum tree by the given array and output the root node of this tree.

Example 1:

Input: [3,2,1,6,0,5]
Output: return the tree root node representing the following tree:

      6
    /   \
   3     5
    \    / 
     2  0   
      \
       1

Note:

The size of the given array will be in the range [1,1000].

分析

題意:給一個數組,找到最大值,左邊的劃爲左子樹,右邊的劃爲右子樹,最大值作爲根。對每個子樹都重複上述操作。

很顯然了,題意中就給出了算法,遞歸就完事。

找到當前數組最大值,左邊的劃爲左子樹數組,右邊的劃爲右子樹數組,最大值作爲根。
遞歸重複上述操作。

解答

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        if(nums.length==0)
            return null;
        int max=maxIndex(nums);
        int[] left = new int[max];
        int[] right = new int[nums.length-max-1];
        // 左子樹
        for(int i=0;i<left.length;++i){
            left[i]=nums[i];
        }
        // 右子樹
        for(int i=0;i<right.length;++i){
            right[i]=nums[max+1+i];
        }
        TreeNode res = new TreeNode(nums[max]);
        res.left=constructMaximumBinaryTree(left);
        res.right=constructMaximumBinaryTree(right);
        return res;
    }
    
    int maxIndex(int[] arr){
        int res=0;
        for(int i=0;i<arr.length;++i){
            if(arr[i]>arr[res])
                res=i;
        }
        return res;
    }
}

在這裏插入圖片描述
表現不是太好,看看別人的代碼。

遞歸同步切分了左右,更快一點。

public class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return construct(nums, 0, nums.length);
    }
    public TreeNode construct(int[] nums, int l, int r) {
        if (l == r)
            return null;
        int max_i = max(nums, l, r);
        TreeNode root = new TreeNode(nums[max_i]);
        root.left = construct(nums, l, max_i);
        root.right = construct(nums, max_i + 1, r);
        return root;
    }
    public int max(int[] nums, int l, int r) {
        int max_i = l;
        for (int i = l; i < r; i++) {
            if (nums[max_i] < nums[i])
                max_i = i;
        }
        return max_i;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章