[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  消灭猕猴桃  阅读(63)  评论(0)    收藏  举报
编辑推荐:
· C#性能优化:为何 x * Math.Sqrt(x) 远胜 Math.Pow(x, 1.5)
· 本可避免的P1事故:Nginx变更导致网关请求均响应400
· 还在手写JSON调教大模型?.NET 9有新玩法
· 复杂业务系统线上问题排查过程
· 通过抓包,深入揭秘MCP协议底层通信
阅读排行:
· AI 的力量,开发者的翅膀:欢迎使用字节旗下的 AI 原生开发工具 TRAE
· 「闲聊文」准大三的我,思前想后还是不搞java了
· C#性能优化:为何 x * Math.Sqrt(x) 远胜 Math.Pow(x, 1.5)
· 千万级的大表如何新增字段?
· 《HelloGitHub》第 112 期
点击右上角即可分享
微信分享提示