当前位置: 首页 > news >正文

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]

示例 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]

示例 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, 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;
    }
}

image-20220830232003719

相关文章:

  • 【原创】基于SSM的快递代取管理系统(快递代取系统毕设源代码)
  • 最长上升子序列
  • python毕业设计题目推荐飞机票销售订票系统
  • 如何恢复删除的数据(以损坏的U盘为例)
  • uverbs的交互方式——ioctl和write
  • Hadoop-Yarn
  • mysql面试题
  • Vue-条件渲染和循环渲染
  • 二、前端-VUE(2)
  • 在腾讯云服务器的Centos上从零开始部署并运行TinyWebServer服务器,过程记录(非常详细)
  • springboot系列(二十):如何通过redis实现手机号验证码功能 |超级详细,建议收藏
  • 原始套接字
  • 【C语言刷LeetCode】1953. 你可以工作的最大周数(M)
  • 猿创征文|Python基础——Visual Studio版本——Web开发
  • 【C语言刷LeetCode】395. 至少有 K 个重复字符的最长子串(M)
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • angular2开源库收集
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Javascript Math对象和Date对象常用方法详解
  • Linux gpio口使用方法
  • PHP变量
  • vue.js框架原理浅析
  • 百度地图API标注+时间轴组件
  • 初识 beanstalkd
  • 精彩代码 vue.js
  • 码农张的Bug人生 - 见面之礼
  • 七牛云假注销小指南
  • 入门级的git使用指北
  • 使用common-codec进行md5加密
  • 世界上最简单的无等待算法(getAndIncrement)
  • 微服务核心架构梳理
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一天一个设计模式之JS实现——适配器模式
  • 用 Swift 编写面向协议的视图
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • const的用法,特别是用在函数前面与后面的区别
  • Java数据解析之JSON
  • MPAndroidChart 教程:Y轴 YAxis
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (day6) 319. 灯泡开关
  • (js)循环条件满足时终止循环
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (黑马C++)L06 重载与继承
  • (论文阅读40-45)图像描述1
  • (七)c52学习之旅-中断
  • (学习日记)2024.01.09
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .net 提取注释生成API文档 帮助文档
  • .NET微信公众号开发-2.0创建自定义菜单
  • // an array of int
  • /proc/stat文件详解(翻译)
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • []串口通信 零星笔记