leetcode日题 894. 所有可能的满二叉树
/** * 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; // } };