95. Unique Binary Search Trees II
DescriptionHintsSubmissionsDiscussSolution
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.
Example:
Input: 3
Output:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST's shown below:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解题思路:由之前的计算数量升级到了输出所有的树,但是方法是一样的,还是利用公式G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0),这里使用了递归的方法。代码如下,在必要地方加了注释
vector<TreeNode*> generateTrees(int n) {
//为什么要
if(n==0)
{
vector<TreeNode*> res_vec;
return res_vec;
}
return generateTrees1(1,n);
}
vector<TreeNode*> generateTrees1(int start, int end){
//为什么要判断start>end,两种特殊情况,i位于首和i位于尾的时候,对应的左右子树也要赋值为null
if(start>end){
vector<TreeNode*> res_vec;
res_vec.push_back(NULL);
return res_vec;
}
//等于时是单个节点,直接构造返回
else if(start==end){
vector<TreeNode*> res_vec;
TreeNode* res_node=new TreeNode(start);
res_vec.push_back(res_node);
return res_vec;
}
vector<TreeNode*> res_vec;
for(int i=start;i<=end;i++){
//算法核心,归并
vector<TreeNode*> l_vec=generateTrees1(start, i-1);
vector<TreeNode*> r_vec=generateTrees1(i+1,end);
for(int k=0;k<l_vec.size();k++){
for(int j=0;j<r_vec.size();j++){
TreeNode* root=new TreeNode(i);
root->left=l_vec[k];
root->right=r_vec[j];
res_vec.push_back(root);
}
}
}
return res_vec;
}
总结:在树中典型的使用递归的思想,要注意这些计算和构造类的,先找规律再使用递归。