Leetcode 654. 最大二叉树

根据整数数组nums,构建一棵最大二叉树,其中根节点是数组中的最大值,左子树由最大值左侧元素递归构建,右子树由最大值右侧元素递归构建。示例和C++实现代码给出。

题目描述

给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:

二叉树的根是数组 nums 中的最大元素。
左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。
返回有给定数组 nums 构建的 最大二叉树 。
示例:
在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
 /*
 思路:
 递归停止条件:构树数组为空
 返回什么: 构造的二叉树的根节点:
 本级递归干什么: 求最大值,分别构造左右子树
 */
class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.size()==0) return NULL;
        return buildtree(nums,0,nums.size()-1);
    }
    TreeNode* buildtree(vector<int>& nums,int l, int r ){
         if(l>r)  return NULL;
         
         int index=l;
         int max=nums[l];
         for(int i=l+1;i<=r;i++){
             if(nums[i]>=max){
                 index=i;
                 max=nums[i];
             }
         }
        TreeNode* root1=new TreeNode();
        root1->left=buildtree(nums,l,index-1);
        root1->right=buildtree(nums,index+1,r);
        root1->val=max;    
        return  root1;

    }
};

注意以后建立树或者链表的新节点,要这样子
TreeNode* root1=new TreeNode();
直接 TreeNode* root1;就一直出错

### 题目分析 Leetcode 654最大二叉树要求根据给定不含重复元素整数数组构建最大二叉树,其规则为:二叉树的根是数组中的最大元素,左子树是通过数组最大值左边部分构造出的最大二叉树,右子树是通过数组最大值右边部分构造出的最大二叉树[^4]。 ### 解题思路分析 - **递归法**:解决此问题的核心思路是递归。先在当前数组区间内找到最大值及其索引,将最大值作为当前根节点,再分别对最大值左边和右边的子数组递归构建左右子树。 - **避免新数组构造**:在构造过程中,为节约时间和空间开销,不建议每次分隔时定义新的数组,而是通过下标索引直接在原数组上操作。 ### 代码实现分析 #### Java代码 ```java class Solution { public TreeNode constructMaximumBinaryTree(int[] nums) { return build(nums, 0, nums.length - 1); } TreeNode build(int[] nums, int lo, int high) { if (lo > high) { return null; } int index = -1; int maxValue = Integer.MIN_VALUE; for (int i = lo; i <= high; i++) { if (nums[i] > maxValue) { index = i; maxValue = nums[i]; } } TreeNode root = new TreeNode(maxValue); root.left = build(nums, lo, index - 1); root.right = build(nums, index + 1, high); return root; } } ``` 此Java代码通过`constructMaximumBinaryTree`方法调用`build`方法开始构建最大二叉树。`build`方法在指定区间`[lo, high]`内找到最大值及其索引,创建根节点,递归构建左右子树[^1]。 #### Python代码 ```python class Solution: """最大二叉树 递归法""" def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode: return self.traversal(nums, 0, len(nums)) def traversal(self, nums: List[int], begin: int, end: int) -> TreeNode: # 列表长度为0时返回空节点 if begin == end: return None # 找到最大的值和其对应的下标 max_index = begin for i in range(begin, end): if nums[i] > nums[max_index]: max_index = i # 构建当前节点 root = TreeNode(nums[max_index]) # 递归构建左右子树 root.left = self.traversal(nums, begin, max_index) root.right = self.traversal(nums, max_index + 1, end) return root ``` Python代码中,`constructMaximumBinaryTree`方法调用`traversal`方法,`traversal`方法在指定区间`[begin, end)`内找到最大值及其索引,创建根节点并递归构建左右子树。避免了创建新数组直接通过下标操作原数组,节约了空间和时间[^2]。 #### C++代码 ```cpp /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return build(nums, 0, nums.size()); } private: // 构造[l, r)范围的最大二叉树 TreeNode* build(const vector<int>& nums, int l, int r) { if (l == r) return nullptr; // 找出[l, r)范围内最大值及索引 int maxVal = nums[l], maxIdx = l; for (int i = l + 1; i < r; i++) { if (nums[i] > maxVal) { maxVal = nums[i]; maxIdx = i; } } TreeNode* root = new TreeNode(maxVal); root->left = build(nums, l, maxIdx); root->right = build(nums, maxIdx + 1, r); return root; } }; ``` C++代码同样采用递归方法,`constructMaximumBinaryTree`方法调用`build`方法,在指定区间`[l, r)`内找到最大值及其索引,创建根节点并递归构建左右子树[^3]。 ### 总结 - **递归是关键**:递归是解决最大二叉树问题的有效方法,通过不断在子数组中找最大构建子树,最终完成整棵树的构建。 - **优化策略**:在构造二叉树时,使用下标索引操作原数组,避免创建新数组,能有效节约时间和空间开销。 - **通用性**:此递归构建思路可应用于其他类似用数组构造二叉树的题目。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值