携手创作,共同成长!这是我参与「掘金日新计划 · 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:
输入: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:
输入: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:
输入: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 成为根节点。
所以我们能够得出两个解题思路
-
当node.val < val的时候,证明node以及它的子树会在节点a的左边。
-
当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;
};