当前位置:首页 > 力扣 > 力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

3个月前 (05-22)

力扣654:递归分治的艺术 如何用最大元素构建二叉树 二叉树 二叉树构建 递归 二叉树遍历 数组 分治策略 C++ 算法 第1张

题目重解

我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的子数组以相同规则构建。这就像是在数组中不断寻找"王者",然后让这个王者统领它的左右领地。


解题思路解析

典型分治策略

1.基准情况:当子数组范围为空时(l == r),返回空指针

2.寻找最大值:在当前子数组范围内遍历,记录最大值及其索引

3.递归构建:以最大值为界,左侧子数组构建左子树,右侧子数组构建右子树 整个过程就像是在不断分割数组的疆域,每个最大值节点都成为该区域的统治者,其左右边界自然划分出它的势力范围。递归的终止条件确保了当领地缩小到空集时停止扩张。


代码和注释

class Solution {
public:
    TreeNode* maxbinarytree(vector<int>& nums, int l, int r) {
        if (r - l == 0)  // 子数组为空时返回nullptr
            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());  // 从完整数组开始构建
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣5:中心扩散法 轻松破解最长回文子串

力扣5:中心扩散法 轻松破解最长回文子串

题目解读:在一个给定的字符串中,我们需要找到最长的回文子串。回文是指正读反读都相同的字符串,如"aba"、"abba"都是回文。这个问题看似简单,但要在字符串中...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

力扣226题:翻转二叉树 - 递归解法详解

力扣226题:翻转二叉树 - 递归解法详解

内容简介本文详细解析了力扣226题"翻转二叉树"的递归解法。通过递归遍历二叉树的每个节点并交换其左右子树,实现了二叉树的完全翻转。文章包含完整注释代码、算法思路讲解和复杂度分析,帮...

手搓二叉树构建类代码详解:从入门到实践(适合新手小白)

一、简介和应用二叉树是数据结构中常见的一种树形结构,每个节点最多有两个子节点(左子节点和右子节点)。它广泛应用于算法设计、数据存储与搜索(如二叉搜索树)、表达式解析等领域。本文将通过手写的C++代码,...

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

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

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

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

发表评论

访客

看不清,换一张

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