首页 > 其他分享 >刷刷刷 Day 20 | 654. 最大二叉树

刷刷刷 Day 20 | 654. 最大二叉树

时间:2023-01-24 20:35:53浏览次数:55  
标签:begin 20 nums int 最大值 654 二叉树 数组 节点

654. 最大二叉树

LeetCode题目要求

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

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

图

示例

输入: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 的节点。
        - 空数组,无子节点。
解题思路

需要每次总数组中找到一个最大值,作为分隔点。比如 3,2,1,6,0,5 先找到最大值 6 后,分隔为 3,2,1 子数组和 0,5 两个子数组,然后再在子数组继续找最大值,如此反复。这个过程有些类似于通过后序遍历数组和中序遍历数组构造二叉树的过程。

上代码

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        // 左闭右开
        return traversal(nums, 0, nums.length);
    }

    private TreeNode traversal(int[] nums, int begin, int end) {
        if (end - begin < 1) {
            return null;
        }

        if (end - begin == 1) {
            return new TreeNode(nums[begin]);
        }

        // 定义分隔点
        int maxPoint = begin;
        // 在 nums 中找到最大值
        int maxVal = 0;
        for (int i = begin; i < end; i++) {
            if (nums[i] > maxVal) {
                maxVal = nums[i];
                maxPoint = i;
            }
        }

        TreeNode root = new TreeNode(maxVal);

        // 根据 maxVal 分隔数组
        // begin point
        // point + 1, end
        root.left = traversal(nums, begin, maxPoint);
        root.right = traversal(nums, maxPoint + 1, end);
        
        return root;
    }
}
重难点

每次找数组中的最大值及对应的下标索引,最大值作为每个子树的root 节点,下标索引用于分隔左右子树,依次递归构造出所有子树
附:学习资料链接

标签:begin,20,nums,int,最大值,654,二叉树,数组,节点
From: https://www.cnblogs.com/blacksonny/p/17066342.html

相关文章

  • P2602 [ZJOI2010] 数字计数
    P2602[ZJOI2010]数字计数-洛谷|计算机科学教育新生态(luogu.com.cn)数位DP模板题由于是对0~9进行统计,所以我们只需对每一个数进行数位DP即可不过对于0和1~9还是......
  • 二叉树TwT
    L2-011玩转二叉树给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设......
  • 刷刷刷 Day 18 | 106. 从中序与后序遍历序列构造二叉树
    106.从中序与后序遍历序列构造二叉树LeetCode题目要求给定两个整数数组inorder和postorder,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请你构......
  • 2023-1-24 WAMP与XAMPP同时安装在一台电脑上是否冲突?
    WAMP与XAMPP同时安装在一台电脑上是否冲突?会有冲突首先,Apache和MySQL都是服务,这里就有可能冲突,这是最大的问题;其次,才是Apache和MySQL监听端口冲突的问题,端口冲突都很......
  • P2260 [清华集训2012]模积和
    P2260[清华集训2012]模积和求\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(n\bmodi)\times(m\bmodj),i\neqj\]mod19940417的值分析假设\(n\lem\)$......
  • 2023牛客寒假算法基础集训营1 个人题解(ACDHKL)
    A.WorldFinal?WorldCup!(I)题意:给10场比赛的点球输赢情况,奇数为A队点球,偶数为B队点球思路:用两个变量x,y来分别存A队当前赢的场次和B队当前赢的场次然后就就扫......
  • Codeforces Round #845 (Div. 2) and ByteRace 2023 A-D
    CodeforcesRound#845(Div.2)andByteRace2023A-DA.EverybodyLikesGoodArrays!题意:对给定数组进行操作:删除相邻两项,替换为两项的乘积,使得该数组奇偶相间。......
  • P2657 [SCOI2009] windy 数 数位DP好题
    P2657[SCOI2009]windy数-洛谷|计算机科学教育新生态(luogu.com.cn)数位DP好题主要问题是:不含前导零且相邻两个数字之差至少为 2solution:现在枚举到了第i位......
  • macOS Big Sur 11.7.3 (20G1116) 正式版 ISO、PKG、DMG、IPSW 下载
    本站提供的macOSBigSur软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。请访问原文链接:https://sysin.org/blog/......
  • macOS Big Sur 11.7.3 (20G1116) Boot ISO 原版可引导镜像
    本站下载的macOSBigSur软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。请访问原文链接:https://sysin.org/blog......