![0c735c388c97b736c62f4f7168057316.png](https://img-blog.csdnimg.cn/img_convert/0c735c388c97b736c62f4f7168057316.png)
题目
给定一个整数n,生成从1到n,所有可以构成的二叉搜索树。
示例:
输入:3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 / / / 3 2 1 1 3 2 / / 2 1 2 3
解析
之前做了一个输出构成二叉树数量的题目,采用动态规划的方法实现。
要生成不同的二叉树,考虑采用递归的形式生成。先生成左右子树,在根节点上分别添加每个左右子树的元素,就可以生成所有可能的二叉搜索树。
生成左右子树的时候,会造成计算重复,可以加入记忆化模块进行搜索,效果有较好的提升。
代码
class Solution {public: vector>> memo; vector generate(int start,int end){ vector ans; if(start > end) return {nullptr}; if(!memo[start][end].empty()) return memo[start][end]; for(int i = start;i <= end;i++){ vector leftTree = generate(start,i-1); vector rightTree = generate(i+1,end); for(auto& l : leftTree) for(auto& r : rightTree){ ans.emplace_back(new TreeNode(i,l,r)); } } return memo[start][end] = ans; } vector generateTrees(int n) { memo.resize(n+1,vector>(n+1)); if(!n) return{}; return generate(1,n); }};