【代码随想录day 17】 力扣 654.最大二叉树
视频讲解:https://www.bilibili.com/video/BV1MG411G7ox/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣题目:https://leetcode.cn/problems/maximum-binary-tree/
这道题主要是要搞清楚最大二叉树的定义:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
因此步骤如下所示:
- 找出最大值确定为根节点,并赋值
- 分为左数组和右数组
- 左数组找最大值,再分
- 右数组找最大值,再分
- 如果没有左右数组直接跳过
- 直到数组长度为1,即遍历到了叶子节点,返回数组
class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {//终止条件,如果nums的长度只剩1就说明到叶子节点了TreeNode *node = new TreeNode(0);if(nums.size()==1){node->val=nums[0];return node;}//找根节点,就是数组的最大值int maxValue=0;int index=0;for(int i=0;i<nums.size();i++){if(nums[i]>maxValue){maxValue=nums[i];index=i;}}node->val=maxValue;//分割左右数组//如果左边有数据就说明有左子树if(index>0){vector<int > newVec(nums.begin(),nums.begin()+index);node->left = constructMaximumBinaryTree(newVec);}//如果右边有数据说明有右子树if(index<(nums.size()-1)){vector<int> newVec(nums.begin()+index+1, nums.end());node->right=constructMaximumBinaryTree(newVec);}return node;}
};