【仿函数(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;
};

浙公网安备 33010602011771号