

做题思路:切割数组,递归解决
递归结束条件:传入数组大小为0
1.遍历数组,得到最大元素。根据此元素创立结点,左右孩子设置为NULL
2.将数组以该最大元素为分割线分为左数组和右数组,求出左右数组的大小
3.递归进入左右数组。将左数组的结果作为左孩子,将递归右数组的结果作为右孩子
4.返回根结点
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){
// 递归结束条件:传入数组大小为0
if(!numsSize)
return NULL;
// 1.遍历数组,得到最大元素。根据此元素创立结点,左右孩子设置为NULL
int i;
int index = -1;
int max = -1;
for(i = 0; i < numsSize; i++) {
if(nums[i] > max) {
index = i;
max = nums[i];
}
}
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = max;
root->left = NULL;
root->right = NULL;
// 2.将数组以该最大元素为分割线分为左数组和右数组,求出左右数组的大小
int leftNum = index;
int rightNum = numsSize - index - 1;
int* leftArr = nums;
int* rightArr = nums + leftNum + 1;
// 3.递归进入左右数组。将左数组的结果作为左孩子,将递归右数组的结果作为右孩子
root->left = constructMaximumBinaryTree(leftArr, leftNum);
root->right = constructMaximumBinaryTree(rightArr, rightNum);
// 4.返回根结点
return root;
}
