这道题刚开始没看举例,还以为让我们构建一个大顶堆。
后面才发现,题目的意思是:每次遍历数组范围中的最大值,将其作为根节点,然后将该数组最大值的左边区域作为左子树,右边的区域作为右子树,依次进行上述遍历。因为对左右子树横向的大小没有要求排序,所以不能在刚开始就对整个数组进行排序,否则会打乱横向子树的顺序。
struct TreeNode* buildTree(int *nums,int left,int right){
//如果数组的左指针大于右指针,说明该区域为空,无需遍历
if(left>right)
return NULL;
//遍历寻找数组的最大值
int maxNum=nums[left];//最大值
int max_index=left;//最大值的下标
for(int i=left;i<=right;i++){
if(maxNum<nums[i]){
maxNum=nums[i];
max_index=i;
}
}
//将最大值作为根节点的值,并将左边区域分配给左子树进行递归
//把右边区域分配给右子树进行递归
struct TreeNode *Node=malloc(sizeof(struct TreeNode));
Node->val=maxNum;
Node->left=buildTree(nums,left,max_index-1);
Node->right=buildTree(nums,max_index+1,right);
return Node;
}
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize){
return buildTree(nums,0,numsSize-1);
}