题目
还是先贴一下题目内容吧,看不懂就跳过好了,我也没明白,下面有看了评论解释的内容...
最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。
给你最大树的根节点
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]
- 难度:简单
- 使用语言:TypeScript
- 链接:最大二叉树 II
我在写这篇文章的时候在思考一个问题,这道题题目到底要不要放上来!
是真的真的看不懂啊,每个中文我都明白,合在一起咋就看不懂了呢。到现在我也没明白他到底想表达什么,我是去这道题目的评论区翻了一下才知道他到底想要我们干嘛。😓
根据评论里的内容,重新翻译一下这道题目吧。
- 会给到一个二叉树
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找到合适的位置塞进去。
总结
- 以后做题目如果看不懂还是多去评论区看看吧,里面有好多人会把题目重新解读一遍,虽然不会那么官方,不过还是对自己看懂题目还是有帮助的。
- 二叉树的题目经常会用到递归,递归要写好一定要注意递归的结束条件和什么时候递归,尤其是结束递归的条件一点要注意,不然很容易无限循环下去。