[leetCode]654. 最大二叉树

题目

链接:https://leetcode-cn.com/problems/maximum-binary-tree

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例 :

输入:[3,2,1,6,0,5]
输出:返回下面这棵树的根节点:

      6
    /   \
   3     5
    \    / 
     2  0   
       \
        1

递归

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        if (nums.length == 0) return null;
        return traversal(nums, 0, nums.length - 1);
    }

    // 左闭右闭区间
    private TreeNode traversal(int[] nums, int begin, int end) {
        // 说明切割完毕返回空
        if (begin > end) return null;
        // 寻找切割点下标
        int rootIndex = getMax(nums, begin, end);
        TreeNode root = new TreeNode(nums[rootIndex]);
        if (begin == end) return root;
        // 切割左子树
        int leftBegin = begin;
        int leftEnd = rootIndex - 1;
        // 切割右子树
        int rightBegin = rootIndex + 1;
        int rightEnd= end;
        // 递归
        root.left = traversal(nums, leftBegin, leftEnd);
        root.right = traversal(nums, rightBegin, rightEnd);
        return root;
    }

    // 获取数组中指定范围内最大值的下标
    private int getMax(int[] nums, int begin, int end) {
        int max = begin;
        for (int i = begin + 1; i <= end; i++) {
            if (nums[i] > nums[max])
                max = i;
        }
        return max;
    }
}
posted @ 2020-11-03 19:01  消灭猕猴桃  阅读(61)  评论(0编辑  收藏  举报