先上迭代解法,关键是要分类清楚。看答案似乎都是先求区间最大值,然后再分治,这样直接迭代求的反而少了,因为不需要反复求最大值,感觉时间复杂度上似乎还要少一点?但是迭代求插入最大值右边的情况似乎也经过了循环。
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode *root=new TreeNode(nums[0]);
//首先要建立一个根节点
for(int i=1;i<nums.size();i++)
{
TreeNode *node=new TreeNode(nums[i]);
if(node->val<root->val)
{//比较下一个数值和根节点大小,如果小于根节点,比较复杂
//首先用复制一个寻找节点
TreeNode *pmove=root;
while(node->val<pmove->val)
{
if(pmove->right==nullptr)
//1、如果寻找结点的右结点为空,说明到头,数值结点作为寻找结点的右节点
{pmove->right=node;break;}
if(node->val>pmove->right->val)
{//2、如果数值结点的值大于寻找结点的右值,则同步骤4
node->left=pmove->right;
pmove->right=node;
break;
}
//3、如果数值结点小于寻找结点的右值,则继续向右寻找
pmove=pmove->right;
}
}
else
{//4、如果大于根节点,根节点作为该结点的左值,同时用该结点代替根节点
node->left=root;
root=node;
}
}
return root;
}
};
递归一直是难点,我承认是自己太菜了……学习了用迭代器和vector球最大值
class Solution {
public:
TreeNode* constrcut(vector<int>::iterator l,vector<int>::iterator r)
{
if(l==r)
return nullptr;
auto it=max_element(l,r);
TreeNode *root=new TreeNode(*it);
root->left=constrcut(l,it);
root->right=constrcut(++it,r);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return constrcut(nums.begin(),nums.end());
}
};