leetcode刷题记录-998. 最大二叉树 II

72 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

前言

今天的题目为中等,题目的意思比较难以理解,可能需要多看看例子才能更好地解题。

每日一题

今天的题目是 998. 最大二叉树 II,难度为中等

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

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

  • 就像 之前的问题 那样,给定的树是利用 Construct(a) 例程从列表 a(root = 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) 。

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

  • 返回 Construct(b) 。

 

示例 1:

image.png

image.png

输入: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:

image.png

image.png

输入: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:

image.png

image.png

输入: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

题解

模拟

题目的意思有一点难懂,大概上就是说在一颗树里面选中最大的值作为结点,然后左节点也是选择最大的数作为左节点,右节点也是选择最大的数作为右节点,一直反复生成一个数。

然后在最后,这个数组末尾会加入一个 val,那么 val 就必定会在树的右边,但是要去判断,他要是比原来的树所有的值都大的话,就会把整个树作为它的子节点,val 成为根节点。

所以我们能够得出两个解题思路

  1. 当node.val < val的时候,证明node以及它的子树会在节点a的左边。

  2. 当node.val > val的时候,证明节点a会在node的右边,继续向右下寻找。当node为null的时候,向node的父节点的右子树添加节点a。

最后按照这个思路模拟解出这道题。

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function insertIntoMaxTree(root: TreeNode | null, val: number): TreeNode | null {
   if(root===null){
       let newNode = new TreeNode()
       newNode.val=val
       return newNode
   }
   if(root.val<val){
       let newNode = new TreeNode()
       newNode.val=val
       newNode.left=root
        return newNode
   }else{
       root.right=insertIntoMaxTree(root.right,val)
   }
    return root;
};

image.png