【仿函数(map排序)】95. 不同的二叉搜索树 II

思路:dfs, 然后用map记录每个数字对应的树,以优化搜索。
map中key为自定义数据结构时,使用仿函数来添加键的比较方式。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

typedef pair<int, int> Posnum;
class pos_sort{
public:
    bool operator() (const Posnum &p_num1, const Posnum &p_num2)const{
        return p_num1.first < p_num2.first 
            || (p_num1.first == p_num2.first && p_num1.second < p_num2.second);
    }
};

class Solution {
public:
    vector<TreeNode*> dfs(int left, int len){
        if (len == 0)
            return {NULL};
        else if (len == 1){
            TreeNode *node = new TreeNode(left);
            p_map[Posnum(left, len)] = vector<TreeNode*>{node};
            return p_map[Posnum(left, len)];
        }
        Posnum p_num = Posnum(left, len);
        if(p_map.find(p_num) != p_map.end())
            return p_map[p_num];
        int right = left + len - 1;
        vector<TreeNode *> result;
        for(int i = left; i <= right ; ++i){
            Posnum p_num_l = Posnum(left, i - left);
            Posnum p_num_r = Posnum(i + 1, right - i);
            auto l_elem = dfs(left, i - left);
            auto r_elem = dfs(i + 1, right - i);
            if(p_map.find(p_num_l) != p_map.end())
                p_map[p_num_l] = l_elem;
            if(p_map.find(p_num_r) != p_map.end())
                p_map[p_num_r] = r_elem;
            for(auto l : l_elem)
                for(auto r : r_elem){
                    TreeNode * node = new TreeNode(i);
                    node -> left = l;
                    node -> right = r;
                    result.push_back(node);
                }
        }
        return result;
    }

    vector<TreeNode*> generateTrees(int n) {
        return dfs(1, n);
    }
private:
    map <Posnum, vector<TreeNode*>, pos_sort> p_map;
};
posted @ 2022-03-01 12:19  fwx  阅读(55)  评论(0)    收藏  举报