携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情
每日刷题 2022.08.30
- leetcode原题链接:leetcode.cn/problems/ma…
- 难度:中等
- 方法:迭代
题目
- 最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。
- 给你最大树的根节点 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
节点一定只具有左节点,右节点为null
- 预期准备:
- 首先无论放在哪个位置,都需要先创建一个新的节点,用于存储
val
,记为:node
- 首先无论放在哪个位置,都需要先创建一个新的节点,用于存储
- 首先考虑:其能替换哪里?
- 情况一:对于构建最大二叉树,其根节点
root
就是当前数组中的最大值,那么如果node节点的val值
大于根节点的值root.val
,就直接将根节点root
作为node
的左节点 - 情况二:
node
节点的val
值小于根节点root.val
,那么后续就需要查找root
节点的右节点。(为什么不是查找root
节点的左节点呢?因为val
是添加数组的末尾的,如果去寻找root
的左节点,那是不是就意味着val
是插入在数组的根节点root
右侧的,这与题目所给的条件(末尾插入位置)矛盾。)如果找到当前的节点cur
值比val
小,那么就将上一个节点的右节点指向node
节点,node
节点的右节点指向cur
。 - 情况三:一直找完所有的节点,都没有找到比
val
小的节点,那么就直接插入到根节点的最下面的右节点(叶子节点)的左节点上即可。
- 情况一:对于构建最大二叉树,其根节点
AC
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} val
* @return {TreeNode}
*/
var insertIntoMaxTree = function(root, val) {
let node = new TreeNode(val);
let r = root;
if(r.val < val) {
node.left = r;
return node;
}
let pre = r, flag = false;
r = r.right;
while(r != null) {
if(val > r.val) {
// 需要将上一个节点记录下来,并且下一个节点也记录下来
pre.right = node;
node.left = r;
flag = true;
break;
}
pre = r;
r = r.right;
}
if(!flag) pre.right = node;
return root;
};