• Leetcode 998.最大二叉树Ⅱ


    1.题目描述

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

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

    在这里插入图片描述

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

    2.思路分析

    本题与Leetcode 654.最大二叉树的区别是, 本题其实没有给出数组nums,给的是已经构建好的二叉

    树的root节点, 但是其实nums和root两个结构是相辅相成的。 此时,我们要加入一个val值,其实也

    就是插入到nums数组的末尾处, 如果不考虑值的大小, val节点是原有所有节点的右侧节点.

    对于题目的理解:

    • 如果val大于root.val,则root就是val节点的左子树节点。
    • 如果val大于非root.val,则非root就是val节点的左子树节点,并且非root节点的原父节点的右子树更新为val节点。
    • 如果val小于最底层的叶子节点,则val节点就作为该叶子节点的右子树节点。

    举个栗子: root = [5,2,3,null,1], val = 4

    1. 将4插入到二叉树中,那么,我们对比root节点node(5) > 4 不可替换,;

    在这里插入图片描述

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

      为它的左子树。
      在这里插入图片描述

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

    子树进行更新

    在这里插入图片描述

    3. 代码实现

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    复杂度分析

    • 时间复杂度:O(n),其中 n 是给定的树中的节点个数。在最坏情况下,树呈现链状结构,前 n-1 个节点有唯一的右子节点,并且 val 比树中任一节点的值都要小,此时需要遍历完整棵树,时间复杂度为 O(n)。
    • 空间复杂度:O(1)。

    参考:

    1.https://leetcode.cn/problems/maximum-binary-tree-ii/solution/by-muse-77-zkfg/

  • 相关阅读:
    6.6.编解码器信息的收集之二
    初识_JDK代理cglib代理_1
    使用 Win2D 实现融合效果
    SpringMvc内置的九大组件
    互联网医院|医疗系统新模式改善看病效率
    android studio 的 adb配置
    Unity反编译:IL2CPP 打包输出的cpp文件和dll(程序集)位置、Mono打包输出的dll(程序集)位置
    第二证券|多只公募基金损失惨重;储能板块低开高走
    docker部署gitlab内存占用过大的解决
    ECharts实现数据可视化入门教程(超详细)
  • 原文地址:https://blog.csdn.net/weixin_44852067/article/details/126611243