所有可能的滿二叉樹
這題的遞歸構造着實沒想出來。。
觀察題給的樣例,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;
}
};