Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
首先可以联想到卡特兰数。当我们从1到n选择根节点时,有不同的树可以生成,可以推出如下结构:
对于n个节点,可以生成的二叉排序树的个数为f(n),则f(n)=f(0)*f(n-1)+f(1)*f(n-2)+...+f(n-1)*f(0)
设m=n-1, 公式就是f(m+1)=西格玛 f(i)*f(m-i), i从0到m, m>=0, 为了使公式成立,需要f(0)=1
所以这是典型的卡特兰数,可以利用这一点方便的求得所能生成的BST的个数。
其实从1到n的数生成的BST的个数和n个节点生成的二叉树的个数是完全一样的,都是卡特兰数。直观上可以这么理解:n个节点生成的每种二叉树,都可以把1到n的数字填进去,所以是一一对应的。
原问题是求所有生成的BST,那可以利用递归求解,关键是如何在递归函数中传递数据。一个方法是利用vector作为返回值,程序如下,也很短:
- class Solution {
- public:
- vector<TreeNode *> generateTrees(int n) {
- return f(1,n);
- }
- vector<TreeNode *> f(int start, int end){
- vector<TreeNode *> result;
- if(start>end){
- result.push_back(NULL);
- return result;
- }
- for(int k=start;k<=end;k++){
- vector<TreeNode *> left=f(start,k-1);
- vector<TreeNode *> right=f(k+1,end);
- for(int i=0;i<left.size();i++){
- for(int j=0;j<right.size();j++){
- TreeNode * root=new TreeNode(k);
- root->left=left[i];
- root->right=right[j];
- result.push_back(root);
- }
- }
- }
- return result;
- }
- };
<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
评论热议
本文探讨了如何生成所有可能的结构唯一的二叉搜索树(BSTs),这些树存储从1到n的值。通过递归方法并利用卡特兰数的概念,文章提供了一个简洁的C++实现方案。
304

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



