题目:Unique Binary Search Trees ll
- English:
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
中文:
给定一个整数n,生成所有结构上唯一的存储值1的BST(二进制搜索树)…n。
例子:
输入:3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
说明:
上述输出对应于如下所示的5个唯一的BST:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
- 分析思路:
1-n先去枚举根节点的位置,从根节点分为左子树和右子树,左右子树分别递归求解所有方案,当前方案就是将左边的求解中随便选择一个方案,右边的求解中随便选择一个方案,乘法原理,将左右两个方案拼接在一起,形成一个新的方案,把所有不同的根节点所有方案累加在一起,就是1-n的所有方案。
不同的方案,有的节点可以共用
- 代码:
/*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{
public:
vector<TreeNode*> binaryTrees(int n){
if(!n) //空树
return vector<TreeNode*>();
return dfs(1,n); //返回所有方案
}
vector<TreeNode*> dfs(int l,int r){ //[l,r]区间,拼成的所有的bst的方案
vector<TreeNode*> res; //存储当前所有方案
if(l>r) //序列长度为0
{
res.push_back(NULL);//空节点
return res;
}
//区间长度大于0
for(int i=1;i<=r;i++){
auto left=dfs(l,i-1); //递归根节点左边的方案数,
right=dfs(i+1,r); //递归根节点右边的方案数
//从左右两边各取一个方案
for(auto <:left)
for(auto &rt:right)
{
auto root=new TreeNode(i);
root->left=lt; //左子树对应的方案的根节点
root->right=rt; //右子树对应的方案的根节点
res.push_back(root);
}
}
return res;
}
};


被折叠的 条评论
为什么被折叠?



