大致思路如上,可以看出这也是一个可以划分成子问题求解的题目,所以考点是动态规划。
但具体对于本题来说,采取的是自底向上的求解过程。
1. 每一次都在一个范围内随机选取一个结点作为根。
2. 选出根结点后应该先分别求解该根的左右子树集合,也就是根的左子树有若干种,它们组成左子树集合,根的右子树有若干种,它们组成右子树集合。
3. 然后将左右子树相互配对,每一个左子树都与所有右子树匹配,每一个右子树都与所有的左子树匹配。然后将两个子树插在根结点上。
4. 最后,把根结点放入结果中。
class Solution {
public:
vector<TreeNode*> generateTrees(int n)
{
if(n<1)
return vector<TreeNode *>();
return helper(1,n);
}
vector<TreeNode *> helper(int begin,int end)
{
vector<TreeNode *> ret;
if(begin>end)
{
ret.push_back(NULL);
}
else if(begin==end)
{
TreeNode *p=new TreeNode(begin);
ret.push_back(p);
}
else
{
for(int i=begin;i<=end;i++)//根节点
{
vector<TreeNode *>left=helper(begin,i-1);
vector<TreeNode *>right=helper(i+1,end);
for(int l=0;l<left.size();l++)
for(int r=0;r<right.size();r++)
{
TreeNode *root=new TreeNode(i);
root->left=left[l];
root->right=right[r];
ret.push_back(root);
}
}
}
return ret;
}
};