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

相关推荐
万能程序员-传康Kk30 分钟前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球36 分钟前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll77881136 分钟前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~38 分钟前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子1 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
Akiiiira1 小时前
【数据结构】栈
数据结构
阳洞洞1 小时前
leetcode 18. 四数之和
leetcode·双指针
程序媛小盐2 小时前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle2 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
c6lala2 小时前
数据结构day1
数据结构