力扣654 最大二叉树 java实现

  1. 最大二叉树

给定一个不重复的整数数组 nums最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边子数组前缀上 构建左子树。
  3. 递归地在最大值 右边子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树

示例 1:

复制代码
输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
        - 空数组,无子节点。
        - [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
            - 空数组,无子节点。
            - 只有一个元素,所以子节点是一个值为 1 的节点。
    - [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
        - 只有一个元素,所以子节点是一个值为 0 的节点。
        - 空数组,无子节点。

示例 2:

复制代码
输入:nums = [3,2,1]
输出:[3,null,2,null,1]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

根据题目描述,我们很容易会想到通过递归的方式对本题进行解答。因为无论是拆分出来左子数组还是右子数组,那么对于子数组的操作,依然都是一样的逻辑。算是分冶的思想。因此使用递归就比较简单。只需要构建当前最大值即可,然后将左右侧的数组继续递归。

以下为java实现代码。

java 复制代码
    public static void main(String[] args) {
        int[] nums = {3,2,1,6,0,5};
        System.out.println(constructMaximumBinaryTree(nums));
    }

    public static TreeNode constructMaximumBinaryTree(int[] nums){
        if (nums.length == 0){
            return null;
        }
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > nums[max]){
                max = i;
            }
        }

        TreeNode res = new TreeNode(nums[max]);
        int[] left = Arrays.copyOfRange(nums, 0, max);
        int[] right = Arrays.copyOfRange(nums, max + 1, nums.length);
        res.left = constructMaximumBinaryTree(left);
        res.right = constructMaximumBinaryTree(right);
        return res;
    }

以上为记录分享用,代码较差请见谅。

相关推荐
一条泥憨鱼1 分钟前
苍穹外卖【day12| 工作台,通过Apache POI导入/导出运营数据】
java·后端·苍穹外卖
wzdark1 分钟前
数据压缩算法的时间复杂度与压缩率权衡4
算法
心平气和量大福大5 分钟前
android-权限
android·java
006_11 分钟前
ruoyi-vue-plus项目 minio外网访问配置
java
小陈phd19 分钟前
深入理解agent学习笔记(一)——现代agent介绍
人工智能·算法
程序猿在线码字22 分钟前
数据结构前置知识(java版)
java
圣保罗的大教堂32 分钟前
leetcode 1665. 完成所有任务的最少初始能量 中等
leetcode
步行cgn34 分钟前
Spring 基于 XML 的自动装配:byType 详解
java·后端·spring
边境悍匪37 分钟前
蜗牛学苑 Java 智能体学习 Day46|贯穿项目 2 思维导图复盘
java·开发语言·vue.js·学习·spring
智慧物业老杨3 小时前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava