所有可能的满二叉树
这题的递归构造着实没想出来。。
观察题给的样例,7个节点的满二叉树,左右子树的节点数目情况为:
1、5 ; 3、3 ; 5、1;
那如果共有5个节点呢,情况有:
1、3 ; 3、1;
那如果有 3个节点呢,情况有:
1 1;
那如果只有1个节点呢?直接返回一个根节点即可。
上述的思维过程其实就是递归的思维过程。
而且很明显发现,递归是有重复的,可以进行一下记忆化。
/**
* 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:
unordered_map<int,vector<TreeNode*>> map;
vector<TreeNode*> allPossibleFBT(int N) {
vector<TreeNode*> res;
if(N==1){
res.push_back(new TreeNode(0));
return res;
}
if(N%2==0){
return res;
}
int lsum = 1;
int rsum = N-1-lsum;
while(rsum>0){
if(!map.count(lsum)){
map[lsum] = allPossibleFBT(lsum);
}
if(!map.count(rsum)){
map[rsum] = allPossibleFBT(rsum);
}
for(TreeNode* lc:map[lsum]){
for(TreeNode* rc:map[rsum]){
TreeNode* root = new TreeNode(0);
root->left = lc;
root->right = rc;
res.push_back(root);
}
}
lsum+=2;
rsum-=2;
}
return res;
}
};