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

相关推荐

11-13 20:16
已编辑
厦门理工学院 软件测试
专业嗎喽:硕佬,把学校背景放后面几段,学校背景双非还学院,让人看了就不想往下看。 把实习经历和个人奖项放前面,用数字化简述自己实习的成果和掌握的技能,比如负责项目一次通过率90%,曾4次发现项目潜在问题风险为公司减少损失等等
点赞 评论 收藏
分享
苗条的伊泽瑞尔最喜欢...:同28届被压力了,电科✌就不能去卷算法吗?把Java留给我们双非卷
投递快手等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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