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

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

7天前

力扣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());  // 从完整数组开始构建
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

题目重解需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。...

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

力扣第71题:用栈轻松解决Unix路径简化问题

力扣第71题:用栈轻松解决Unix路径简化问题

题目解读:在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名...

洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

发表评论

访客

看不清,换一张

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