生成所有二叉搜索樹
題目見 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);
}
};