首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >50 Maximum Binary Tree

50 Maximum Binary Tree

作者头像
devi
发布2021-08-18 16:19:46
发布2021-08-18 16:19:46
3420
举报
文章被收录于专栏:搬砖记录搬砖记录

题目

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
      6
    /   \
   3     5
    \    / 
     2  0   
      \
       1

Note:

代码语言:javascript
复制
The size of the given array will be in the range [1,1000].

分析

题意:给一个数组,找到最大值,左边的划为左子树,右边的划为右子树,最大值作为根。对每个子树都重复上述操作。

很显然了,题意中就给出了算法,递归就完事。

代码语言:javascript
复制
找到当前数组最大值,左边的划为左子树数组,右边的划为右子树数组,最大值作为根。
递归重复上述操作。

解答

代码语言:javascript
复制
/**
 * 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;
    }
}

表现不是太好,看看别人的代码。

递归同步切分了左右,更快一点。

代码语言:javascript
复制
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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 分析
  • 解答
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档