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;
    }
}
全部评论

相关推荐

05-30 18:54
武汉商学院 Java
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务