给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
- 二叉树的根是数组中的最大元素。
- 左子树是通过数组中最大值左边部分构造出的最大二叉树。
- 右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
Example 1:
输入: [3,2,1,6,0,5]
输入: 返回下面这棵树的根节点:
6
/ \
3 5
\ /
2 0
\
1
注意:
给定的数组的大小在 [1, 1000] 之间。
C
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int find(int* nums, int n)
{
int ans=INT_MIN;
int res=0;
for(int i=0;i<n;i++)
{
if(nums[i]>ans)
{
ans=nums[i];
res=i;
}
}
return res;
}
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize)
{
int n=numsSize;
if(0==n)
{
return NULL;
}
else if(1==n)
{
struct TreeNode* res=(struct TreeNode*)malloc(sizeof(struct TreeNode));
res->val=nums[0];
res->left=NULL;
res->right=NULL;
return res;
}
else
{
struct TreeNode* res=(struct TreeNode*)malloc(sizeof(struct TreeNode));
int index=find(nums,n);
res->val=nums[index];
int* left=(int*)malloc(sizeof(int)*index);
for(int i=0;i<index;i++)
{
left[i]=nums[i];
}
int* right=(int*)malloc(sizeof(int)*(n-index-1));
for(int i=index+1;i<n;i++)
{
right[i-index-1]=nums[i];
}
res->left=constructMaximumBinaryTree(left,index);
res->right=constructMaximumBinaryTree(right,n-index-1);
return res;
}
}
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums)
{
int n=nums.size();
if(0==n)
{
return NULL;
}
else if(1==n)
{
TreeNode* res=new TreeNode(nums[0]);
return res;
}
else
{
int index=max_element(nums.begin(),nums.end())-nums.begin();
TreeNode* res=new TreeNode(nums[index]);
vector<int>::iterator it=nums.begin();
vector<int>::iterator last1=nums.begin()+index;
vector<int>::iterator first2=nums.begin()+index+1;
vector<int> left(it,last1);
vector<int> right(first2,nums.end());
res->left=constructMaximumBinaryTree(left);
res->right=constructMaximumBinaryTree(right);
return res;
}
}
};
python
class Solution:
def constructMaximumBinaryTree(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
n=len(nums)
if 0==n:
return None
elif 1==n:
return TreeNode(nums[0])
else:
index=nums.index(max(nums))
res=TreeNode(nums[index])
left=nums[0:index]
right=nums[index+1:]
res.left=self.constructMaximumBinaryTree(left)
res.right=self.constructMaximumBinaryTree(right)
return res