生成所有二叉搜索树
题目见 leetcode-cn unique-binary-search-tree-ii .
题目
给定一个整数 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]
]
思路
本来想用回溯,但是觉得太复杂,就去看了题解。
从Catalan数的一个定义出发,来对每一个根 i,递归生成对应的左子树1…i-1和右子树i+1…n,再得到所有组合的树,就很好理解和实现。参考了题解的java写的如下C++代码。
C++代码
/**
* 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 {
vector<TreeNode*> generate(int start, int end) {
vector<TreeNode*> all;
if (start>end) {
all.push_back(nullptr);
return all;
}
for (int i=start;i<=end;i++) {
vector<TreeNode*> left=generate(start,i-1);
vector<TreeNode*> right=generate(i+1,end);
for (auto l:left) {
for (auto r:right) {
TreeNode* node=new TreeNode(i);
node->left=l;
node->right=r;
all.push_back(node);
}
}
}
return all;
}
public:
vector<TreeNode*> generateTrees(int n) {
if (n==0) return vector<TreeNode*>();
return generate(1,n);
}
};