• 998. 最大二叉树 II(难度:中等)


    998. 最大二叉树 II(难度:中等)

    题目链接:https://leetcode.cn/problems/maximum-binary-tree-ii/

    题目描述:

    最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。

    给你最大树的根节点 root 和一个整数 val

    就像 之前的问题 那样,给定的树是利用 Construct(a) 例程从列表 aroot = Construct(a))递归地构建的:

    • 如果 a 为空,返回 null
    • 否则,令 a[i] 作为 a 的最大元素。创建一个值为 a[i] 的根节点 root
    • root 的左子树将被构建为 Construct([a[0], a[1], ..., a[i - 1]])
    • root 的右子树将被构建为 Construct([a[i + 1], a[i + 2], ..., a[a.length - 1]])
    • 返回 root

    请注意,题目没有直接给出 a ,只是给出一个根节点 root = Construct(a)

    假设 ba 的副本,并在末尾附加值 val。题目数据保证 b 中的值互不相同。

    返回 Construct(b)

    示例 1:

    imgimg

    输入:root = [4,1,3,null,null,2], val = 5
    输出:[5,4,null,1,3,null,null,2]
    解释:a = [1,4,2,3], b = [1,4,2,3,5]
    
    • 1
    • 2
    • 3

    示例 2:
    imgimg

    输入:root = [5,2,4,null,1], val = 3
    输出:[5,2,4,null,1,null,3]
    解释:a = [2,1,5,4], b = [2,1,5,4,3]
    
    • 1
    • 2
    • 3

    示例 3:
    imgimg

    输入:root = [5,2,3,null,1], val = 4
    输出:[5,2,4,null,1,3]
    解释:a = [2,1,5,3], b = [2,1,5,3,4]
    
    • 1
    • 2
    • 3

    提示:

    • 树中节点数目在范围 [1, 100]
    • 1 <= Node.val <= 100
    • 树中的所有值 互不相同
    • 1 <= val <= 100

    解法:递归

    题目大致意思如下:

    首先,如果有一个数组a要构造最大树,最大树的构造过程,先找到数组中的最大元素,然后将其作为根节点,然后将左右两边数组分别组成左右子树。

    但是,这道题并没有给我们提供数组a,而是一个由数组a构成的最大树的根节点root,和一个值val,已知val是数组a后面新增的一个元素。

    综合最大树的定义,数组最左边的元素,要不然是最大值,作为树的跟节点,要不然就一定在根节点的右子树上。通过题目意思,我们可以得到 val 和根节点root之间分为下面两种情况:

    • val > root.valval的构成新节点treeNode作为根节点,原root节点作为treeNode的左子节点。
    • val < root.valval的构成新节点treeNode一定在根节点root的右子树上面。

    至此,我们可以一直递归右子树,直到找到val > root.val的节点,或者是遍历完所有的右子树都没有找到合适的,那么val 构成的新节点就一定是最后一层叶子节点的右叶子节点。到我们已经可以构成递归算法了,找到递归的退出条件:

    • val > root.val,val的构成新节点treeNode作为根节点,原root节点作为treeNode的左子节点。
    • root == null,val的构成新节点treeNode作为根节点,返回。

    代码:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public TreeNode insertIntoMaxTree(TreeNode root, int val) {
            if(root == null) {
                return new TreeNode(val);
            }
    
            if(val > root.val) {
                TreeNode treeNode = new TreeNode(val);
                treeNode.left = root;
                return treeNode;
            } else {
                root.right = insertIntoMaxTree(root.right,val);
            }
            return root;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    image-20220830232003719

  • 相关阅读:
    Hystrix面试题大全
    【001】 libpq是什么?如何使用?
    基于SpringMVC+Hibernate开发企业库存管理系统的设计与实现+任务书+PPT 毕业设计
    基于JSP技术的校园餐厅管理系统
    HCIA-综合实验(三)
    JavaSE - 逻辑控制语句
    React学习笔记(一)
    暑假加餐|有钱人和你想的不一样+多目标蝙蝠优化算法(Matlab代码实现)
    LFU 缓存 -- LinkedHashSet
    通配符匹配
  • 原文地址:https://blog.csdn.net/baidu_41907361/article/details/126614964