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),因为需要存储递归调用的栈。

相关推荐
casual~9 分钟前
模逆元计算方法详解:扩展欧几里得算法与费马小定理
学习·算法·逆元
脚踏实地皮皮晨35 分钟前
002002002_DepandencyObject类2
开发语言·windows·算法·c#·visual studio
0566462 小时前
Python康复训练——数据结构
数据结构·windows·python
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-27 冒泡法排序(C语言实现)
c语言·开发语言·数据结构·算法
大鱼>3 小时前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融
c238565 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
吃好睡好便好5 小时前
MATLAB中图像的对数变换
图像处理·学习·算法·计算机视觉·matlab
noipp5 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室5 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
冻柠檬飞冰走茶5 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法