最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。
给你最大树的根节点
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)。

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

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

输入: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
本题与Leetcode 654.最大二叉树的区别是, 本题其实没有给出数组nums,给的是已经构建好的二叉
树的root节点, 但是其实nums和root两个结构是相辅相成的。 此时,我们要加入一个val值,其实也
就是插入到nums数组的末尾处, 如果不考虑值的大小, val节点是原有所有节点的右侧节点.
对于题目的理解:
举个栗子: root = [5,2,3,null,1], val = 4

继续遍历 node(5)的右子树node(3),因为node(3) < 4,所以创建val=4这个节点,并将node(3)作
为它的左子树。

新创建的node(4)代替的node(3)原有二叉树中的位置,所以,对node(4)的原父节点node(5)的右
子树进行更新

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def insertIntoMaxTree(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
parent, cur = None, root
while cur:
# 如果val>根节点的值,此时root节点就是val的左子树节点
if val > cur.val:
# 根节点
if not parent:
return TreeNode(val, root, None)
# 非根节点
# 创建val节点,其左子树节点为cur节点
node = TreeNode(val, cur, None)
# 将非根节点的父节点的右子树更新为node节点
parent.right = node
return root
else: # 如果val <= root.val 不可替换,继续遍历根节点的右子树
parent = cur
cur = cur.right
# 叶子节点
parent.right = TreeNode(val)
return root
复杂度分析
- 时间复杂度:O(n),其中 n 是给定的树中的节点个数。在最坏情况下,树呈现链状结构,前 n-1 个节点有唯一的右子节点,并且 val 比树中任一节点的值都要小,此时需要遍历完整棵树,时间复杂度为 O(n)。
- 空间复杂度:O(1)。
参考:
1.https://leetcode.cn/problems/maximum-binary-tree-ii/solution/by-muse-77-zkfg/