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

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

10个月前 (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());  // 从完整数组开始构建
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

题目解读‌:在二叉搜索树的世界里,每个节点都默默记录着自己的数值。现在我们需要找出这些数值中出现频率最高的那些数字,也就是所谓的"众数"。有趣的是,二叉搜索树本身具有左小右大的特性...

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

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

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

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

一、题目解读牛客232639题要求计算一个整数数组中能够组成有效三角形的三边组合数量。根据三角形不等式,三边需满足任意两边之和大于第三边。例如,数组[3, 4, 5, 6]可组成两个有效三角形([3,...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

一、题目解读洛谷P3393题要求在一个包含N个城市和M条双向道路的图中,求解从起点1到终点N的最小花费路径。图中存在僵尸城市(僵尸无法通过)和危险城市(由僵尸城市扩散S步后标记),需要避开所有危险城市...

发表评论

访客

看不清,换一张

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