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

相关推荐
We་ct1 分钟前
LeetCode 1. 两数之和:两种高效解法(双指针 + Map)
前端·算法·leetcode·typescript·哈希算法
无风听海4 分钟前
.NET 10之可空引用类型
数据结构·.net
aini_lovee5 分钟前
基于MATLAB的材料晶粒组织生长与变化模拟:方法、实现与应用
开发语言·算法·matlab
t198751287 分钟前
基于MATLAB的Copula对数似然值计算与参数验证
人工智能·算法·matlab
潇冉沐晴11 分钟前
div2 1064补题笔记(A~E)
笔记·算法
YuTaoShao11 分钟前
【LeetCode 每日一题】3640. 三段式数组 II——(解法二)DP
算法·leetcode·职场和发展
我爱工作&工作love我23 分钟前
P4913 【深基16.例3】二叉树深度 dfs-二叉树的遍历
算法·深度优先·图论
月挽清风28 分钟前
代码随想录第十四天
数据结构
TracyCoder12331 分钟前
LeetCode Hot100(25/100)——2. 两数相加(链表)
算法·leetcode·链表
long31631 分钟前
Z算法(线性时间模式搜索算法)
java·数据结构·spring boot·后端·算法·排序算法