力扣第654题:最大二叉树解题教程 用数组构造最大二叉树
题目解读
给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思想,将大问题分解为小问题来解决,最终组合成完整的解决方案。
解题思路与过程
用递归和分治的方法来构建最大二叉树。定义一个辅助函数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()); } };
原创内容 转载请注明出处