给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
思路:找数组的最大值及其下标,分割数组,终止条件:如果数组大小为1 返回;
这里因为终止条件对数组大小有要求,所以在向左右递归的时候,需要判断最大值的左边与右边是否存在元素。
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size()==1) return new TreeNode(nums[0]);
//找数组中的最大值及其下标,按照这个下标来分数组
int Max=-1,maxIndex=-1;
for(int i=0;i<nums.size();i++)
{
if(nums[i]>Max)
{
Max=nums[i];
maxIndex=i;
}
}
TreeNode* root=new TreeNode(Max);
//排除左边的数组没有的情况,即最大值下标就是0
//这个判断条件是因为终止条件是至少要有一个元素
if(maxIndex>0)
{
vector<int> leftnums(nums.begin(),nums.begin()+maxIndex);
root->left=constructMaximumBinaryTree(leftnums);
}
//排除右边数组为空
if(maxIndex<nums.size()-1)
{
vector<int> rightnums(nums.begin()+maxIndex+1,nums.end());
root->right=constructMaximumBinaryTree(rightnums);
}
return root;
}
};