• LeetCode-998. 最大二叉树 II【最大二叉树】


    题目描述:

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

    给你最大树的根节点 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一定在root的右子树上。情况一:val最大,那么root为val的左子树。情况二:val一直小于root的右子树,那么val在最右下。情况三:val大于root右子树的其中一个,那么将该右子树作为val的左子树,val连接在上一个节点的右边。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution {
    public:
        TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
            TreeNode* parent = nullptr;
            TreeNode* cur = root;
            while(cur){
                if(val>cur->val){
                    if(!parent) return new TreeNode(val,root,nullptr);//val最大
                    TreeNode* node = new TreeNode(val,cur,nullptr);//val小于root->val但是大于其中一个右子树的val
                    parent->right=node;
                    return root;
                }else{//向右子树遍历
                    parent=cur;
                    cur=cur->right;
                }
            }
            parent->right=new TreeNode(val);//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
    • 28
    • 29
    • 30
    • 31

    复杂度分析

    时间复杂度:O(n)
    空间复杂度:O(1)

    解题思路二:两行代码。。。用到了递归。递归栈空间复杂度会较高。

    class Solution {
    public:
        TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
            if (!root || root->val < val) return new TreeNode(val, root, nullptr);
            root->right = insertIntoMaxTree(root->right, val);
            return root;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解题思路三:暂无

    
    
    • 1
  • 相关阅读:
    在将对象 => JSON格式时,无法序列化部分属性
    Flowable监听器动态调用Springcloud接口
    小程序页面跳转
    【入门Flink】- 08Flink时间语义和窗口概念
    Java 解析线程的几种状态详解
    Nvm的使用
    ts中关于path使用RouteLocationRaw报错
    2021长安杯-高校组-Crypto-easyrsa
    第 3 章 栈和队列(单链队列)
    oauth2.0鉴权,登录访问 “/oauth/token”,请求头Authorization(basicToken)如何取值???
  • 原文地址:https://blog.csdn.net/qq_45934285/article/details/126595920