思路:递归构造,选取当前序列的根节点,然后递给构造以该根节点的左子树集合和右子树集合,因为序列是递增的,所以根节点左边的子树一定比根节点小,右子树一定比右子树大。递归出口是end>begin,返回NULL。
参考的题解代码:
/**
* 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:
vector<TreeNode*> getTree(int begin,int end){
if(begin>end){
return vector<TreeNode*>{NULL};
}
vector<TreeNode*>v;
for(int i=begin;i<=end;i++){ //以i为根节点
vector<TreeNode*>lefts=getTree(begin,i-1); //存的是所有左子树的集合
vector<TreeNode*>rights=getTree(i+1,end); //右子树的集合
for(int j=0;j<lefts.size();j++){
for(int k=0;k<rights.size();k++){
TreeNode* root=new TreeNode(i);
root->left=lefts[j];
root->right=rights[k];
v.push_back(root);
}
}
}
return v;
}
vector<TreeNode*> generateTrees(int n) {
if(!n)
return vector<TreeNode*>{};
return getTree(1,n);
}
};