思路:参考http://www.cnblogs.com/grandyang/p/4301096.html
自己的理解:在递归函数generateTreesDFS中subTree用的都是指针是为了形成动态数组。else里面,以i为节点的数,左子树的范围都必须比i小即为代码中的vector<TreeNode*> leftsubTree=generateTreesDFS(start,i-1);右子树都必须比i大,即为代码中的
vector<TreeNode> *rightsubTree=generateTreesDFS(i+1,end);
最里面的两个循环是将所有以i为节点的左右子树的可能情况进行合成。
注意:不是最后才将所有的结果合成的,而是从递归函数的最底端,将可能的情况合成,然后再上升到上一层的递归函数,再将可能的情况合成,直到最上层的递归函数。这也就是为什么subtree、*leftsubTree、*rightsubTree都是动态数组的原因了。
/**
* 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*> generateTrees(int n) {
if(n<1) return{};
return *generateTreesDFS(1,n);
}
vector<TreeNode*> *generateTreesDFS(int start,int end)
{
vector<TreeNode*> *subTree=new vector<TreeNode*>();
if(start>end) subTree->push_back(NULL);
else
{
for(int i=start;i<=end;++i)
{
vector<TreeNode*> *leftsubTree=generateTreesDFS(start,i-1);
vector<TreeNode*> *rightsubTree=generateTreesDFS(i+1,end);
for(int j=0;j<leftsubTree->size();++j)
for(int k=0;k<rightsubTree->size();++k)
{
TreeNode*node=new TreeNode(i);
node->left=(*leftsubTree)[j];
node->right=(*rightsubTree)[k];
subTree->push_back(node);
}
}
}
return subTree;
}
};