/**
* 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:
//优化版
//递归,左子树有i个节点时,右子树有N-i-1个节点(-1表示减去根节点)
//则可以遍历当i为1到N-2,左右子树分别递归,然后遍历左右子树集合,拼接到根节点并加入答案树集。
//这里将答案树集改为dp,当递归到同一个N的的可能树集时,直接返回已经计算好的树集
map<int,vector<TreeNode*> > ans;
vector<TreeNode*> allPossibleFBT(int N) {
//满二叉树节点数一定为奇数
if(N%2==0){
return {};
}
//当递归到同一个N的的可能树集时,直接返回已经计算好的树集
//这步要先执行,否则会重复插入ans[1]
if(ans[N].size()){
return ans[N];
}
//叶子节点
if(N==1){
ans[1].push_back(new TreeNode(0));
return ans[1];
}
//满二叉树的左右子树要么都有,要么都没有
for(int i=1;i<N-1;i+=2){
//递归左右子树,获得左右子树集
vector<TreeNode*>left=allPossibleFBT(i);
vector<TreeNode*>right=allPossibleFBT(N-i-1);
for(auto l:left){
for(auto r:right){
TreeNode* root=new TreeNode(0);
root->left=l;
root->right=r;
ans[N].push_back(root);
}
}
}
return ans[N];
}
// //原版
// vector<TreeNode*> allPossibleFBT(int N) {
// vector<TreeNode*> ans;
// //满二叉树节点数一定为奇数
// if(N%2==0){
// return ans;
// }
// //叶子节点
// if(N==1){
// ans.push_back(new TreeNode(0));
// return ans;
// }
// //满二叉树的左右子树要么都有,要么都没有
// for(int i=1;i<N-1;i+=2){
// //递归左右子树,获得左右子树集
// vector<TreeNode*>left=allPossibleFBT(i);
// vector<TreeNode*>right=allPossibleFBT(N-i-1);
// for(auto l:left){
// for(auto r:right){
// TreeNode* root=new TreeNode(0);
// root->left=l;
// root->right=r;
// ans.push_back(root);
// }
// }
// }
// return ans;
// }
};