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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章