LeetCode 894. 所有可能的满二叉树 (递归的构造、记忆化递归)

所有可能的满二叉树
这题的递归构造着实没想出来。。
观察题给的样例,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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章