思路:先找到最大的数。建立根节点。在递归遍历最大节点的左半部分和右半部分。构造树
代码1 :
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size()==0)
return NULL;
return createTree(nums,0,nums.size()-1);
}
TreeNode* createTree(vector<int>& nums,int start,int end){
if(start>end){
return NULL;
}
int maxN=nums[start];
int i=start;
int j=end;
int index=start;
while(i<=j){
if(nums[i]>maxN){
maxN=nums[i];
index=i;
}
i++;
}
TreeNode* root=new TreeNode(maxN);
root->left=createTree(nums,start,index-1);
root->right=createTree(nums,index+1,end);
return root;
}
思路: 遍历数组。对每个数都新建一个节点。然后与前面的节点对比,如果大于前面的节点。则前面的节点是其左子树。否则新节点是右子树。
代码2 : 非递归
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
vector<TreeNode*> vec;
int n=nums.size();
for(int i=0;i<n;i++){
TreeNode* p=new TreeNode(nums[i]);
while(vec.size() && vec.back()->val < nums[i]){
p->left=vec.back();
vec.pop_back();
}
if(vec.size()){
vec.back()->right=p;
}
vec.push_back(p);
}
return vec.front();
}