力扣每日一题(998. 最大二叉树 II)

96 阅读3分钟

题目

还是先贴一下题目内容吧,看不懂就跳过好了,我也没明白,下面有看了评论解释的内容...

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

给你最大树的根节点 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)

假设 ba 的副本,并在末尾附加值 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]

我在写这篇文章的时候在思考一个问题,这道题题目到底要不要放上来!

是真的真的看不懂啊,每个中文我都明白,合在一起咋就看不懂了呢。到现在我也没明白他到底想表达什么,我是去这道题目的评论区翻了一下才知道他到底想要我们干嘛。😓

根据评论里的内容,重新翻译一下这道题目吧。

  • 会给到一个二叉树tree,一个数子n
  • 如果这个数字比根结点大,就让这个数字变成根结点,原先的树变成这个新的根结点的左子树
  • 如果数字没有根结点大,那就去右子树里找,直到找到比n小的右子树tree1,然后把tree1变成n的的左子树,再放回tree
  • 做这些就是为了得到一个最大二叉树,看这里会好理解一些。

如果能理解题目的意思的话,着题确实不难,大概意思就是把val塞到tree中去,让他变成最大二叉树,这道题用递归就可以很快解决了,直接上代码吧,还是很好看懂的。

/**
 * 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 {
    let node: TreeNode | null
    if (!root) {
        node = new TreeNode(val)
        return node
    }
    if (val > root.val) {
        node = new TreeNode(val, root)
        return node
    }
    if (val < root.val) {
        root.right = insertIntoMaxTree(root.right, val)
        return root
    }
};

看代码读懂题目意思,一直向右递归直到val找到合适的位置塞进去。

总结

  • 以后做题目如果看不懂还是多去评论区看看吧,里面有好多人会把题目重新解读一遍,虽然不会那么官方,不过还是对自己看懂题目还是有帮助的。
  • 二叉树的题目经常会用到递归,递归要写好一定要注意递归的结束条件和什么时候递归,尤其是结束递归的条件一点要注意,不然很容易无限循环下去。