当前位置:首页 > 力扣 > 力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

10个月前 (05-21)

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树 二叉树 算法 C++ 力扣 递归 分治 数组 动态数组 STL 第1张

题目解读

给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思想,将大问题分解为小问题来解决,最终组合成完整的解决方案。


解题思路与过程

用递归和分治的方法来构建最大二叉树。定义一个辅助函数maxbinarytree来处理子数组的构建过程。当子数组为空时返回空指针,否则找到当前子数组的最大值作为根节点值,并记录其索引位置。然后递归构建左子树(使用最大值左侧的子数组)和右子树(使用最大值右侧的子数组)。主函数constructMaximumBinaryTree初始化整个构建过程,传入整个数组和初始边界。


代码实现与注释

class Solution {
public:
    // 递归构建最大二叉树的辅助函数
    TreeNode* maxbinarytree(vector<int>& nums, int l, int r) {
        if (r - l == 0)  // 基本情况:子数组为空
            return nullptr;
            
        TreeNode* root = new TreeNode(0);  // 创建新节点
        int maxidx = l;  // 初始化最大值索引
        
        // 遍历当前子数组,找到最大值及其索引
        for (int i = l; i < r; i++) {
            root->val = max(root->val, nums[i]);
            if(root->val == nums[i])
                maxidx = i;
        }
        
        // 递归构建左子树和右子树
        root->left = maxbinarytree(nums, l, maxidx);
        root->right = maxbinarytree(nums, maxidx + 1, r);
        
        return root;  // 返回当前构建的子树
    }
    
    // 主函数:初始化最大二叉树构建过程
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        return maxbinarytree(nums, 0, nums.size());
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

手搓邻接矩阵类代码注释与实现指南:从零开始理解图论数据结构(适合小白)

一、简介和特点邻接矩阵是用于表示图(Graph)的一种数据结构,通常用二维数组存储节点之间的关系。本文的graph类通过C++实现了一个基础的邻接矩阵结构,特点如下:1. 动态创建:根据用户输入的节点...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

牛客NC67题解:汉诺塔递归算法与解题步骤

牛客NC67题解:汉诺塔递归算法与解题步骤

一、题目解读牛客NC67题要求解决汉诺塔问题,这是一个经典的递归算法题目。题目给定整数n,代表汉诺塔中的盘子数量,需要输出将n个盘子从起始柱移动到目标柱的所有步骤。汉诺塔问题规则为:每次只能移动一个盘...

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

一、题目解读LeetCode 2778题要求计算数组中下标为n的因数的元素的平方和。例如,若n=6,其因数为1、2、3、6,则需计算nums[0]、nums[1]、nums[2]、nums[5]的平方...

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

洛谷2652题解析:同花顺排序问题的动态规划与滑动窗口优化

一、题目解读洛谷2652题要求对一组扑克牌进行排序,目标是找到最少需要调整的次数,使得所有牌形成同花顺。题目中,扑克牌由花色和数字组成,需先按花色排序,再在同花色内按数字排序。核心难点在于如何处理花色...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。