178.二叉树:最大二叉树(力扣)

代码解决

cpp 复制代码
/**
 * 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* constructMaximumBinaryTree(vector<int>& nums) 
    {
        // 创建一个新的树节点,初始值为0
        TreeNode* node = new TreeNode(0);
        // 如果输入数组长度为1,直接赋值给根节点的值,并返回该节点
        if(nums.size()==1)
        {
            node->val=nums[0];
            return node;
        }

        // 初始化最大值为0,索引为0
        int maxVal = 0;
        int index = 0;
        // 遍历数组找到最大值及其索引
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] > maxVal)
            {
                maxVal = nums[i];
                index = i;
            }
        }

        // 将最大值赋给根节点
        node->val = maxVal;
        // 如果最大值索引大于0,递归构建左子树
        if(index > 0)
        {
            // 创建左子数组
            vector<int> vec(nums.begin(), nums.begin() + index);
            // 递归构建左子树
            node->left = constructMaximumBinaryTree(vec);
        }

        // 如果最大值索引小于数组长度减1,递归构建右子树
        if(index < (nums.size() - 1))
        {
            // 创建右子数组
            vector<int> vec1(nums.begin() + index + 1, nums.end());
            // 递归构建右子树
            node->right = constructMaximumBinaryTree(vec1);
        }
        // 返回构建的树节点
        return node;
    }
};
  1. 首先创建一个新的树节点 node,其初始值为0。
  2. 如果输入数组长度为1,直接将数组中的第一个元素赋值给根节点的值,并返回该节点。
  3. 初始化最大值为0,索引为0。
  4. 遍历数组,找到最大值及其索引。
  5. 将最大值赋给根节点的值。
  6. 如果最大值索引大于0,创建一个包含从数组开始到最大值索引的子数组,递归构建左子树。
  7. 如果最大值索引小于数组长度减1,创建一个包含从最大值索引+1到数组结束的子数组,递归构建右子树。
  8. 返回构建的树节点。

这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是数组中元素的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。

相关推荐
CoovallyAIHub8 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP9 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo9 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo9 小时前
300:最长递增子序列
算法
CoovallyAIHub14 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工2 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农2 天前
【React用到的一些算法】游标和栈
算法·react.js