Leetcode---Unique Binary Search Trees II
来源:互联网 发布:阿里云主机80端口打开 编辑:程序博客网 时间:2024/06/08 00:56
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;
- }
- };
0
上一篇:Leetcode---Interleaving String
下一篇:Leetcode---Valid Palindrome
相关热门文章
- 大量野生菌上市
- 目前已经完成对接项目56项...
- 一年就卖了1300块钱
- 三是要严格实施引种隔离...
- 会议期间
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- 谁能够帮我解决LINUX 2.6 10...
- 现在的博客积分不会更新了吗?...
- shell怎么读取网页内容...
- ssh等待连接的超时问题...
- curl: (56) Recv failure: Con...
给主人留下些什么吧!~~
评论热议
0 0
- LeetCode: Unique Binary Search Trees II
- LeetCode : Unique Binary Search Trees II
- [LeetCode] Unique Binary Search Trees II
- leetcode Unique Binary Search Trees II
- [LeetCode]Unique Binary Search Trees II
- [leetcode]Unique Binary Search Trees II
- LeetCode-Unique Binary Search Trees II
- [leetcode] Unique Binary Search Trees II
- LeetCode - Unique Binary Search Trees II
- LeetCode 95: Unique Binary Search Trees II
- Leetcode Unique Binary Search Trees II
- [LeetCode] Unique Binary Search Trees II
- Leetcode: Unique Binary Search Trees II
- leetcode Unique Binary Search Trees II
- 【Leetcode】Unique Binary Search Trees II
- LeetCode | Unique Binary Search Trees II
- Leetcode Unique Binary Search Trees II
- [LeetCode] Unique Binary Search Trees II
- 求两个等长有序数组的中位数
- Leetcode---Triangle
- Leetcode---Decode Ways
- Leetcode---Interleaving String
- Summarize 2014 Look Ahead 2015
- Leetcode---Unique Binary Search Trees II
- Leetcode---Valid Palindrome
- Xcode文档使用
- Leetcode---Palindrome Number
- Leetcode---Palindrome Partitioning
- Leetcode---Sudoku Solver
- Leetcode---Surrounded Regions
- 在腾讯实习的那段日子:不要在难受的时候选择 '逃避/离开'
- Leetcode---Word Break II
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
生病图片带字
关于生病的图片
生病用英语怎么说
一个人生病难受的图片
生病图片可怜卡通
生病祝福图片
生病的图片卡通
生病了的图片
生病英语怎么说
有病的英文
得病
五分钟内怎么快速生病
千万别在奶奶家生病
15岁小学生白丝短裙露内内
体育生搞白袜基故事
脱缰白凝相乐生
偶像练习生之白俊
白萝卜生吃
虚室生白
白袜体育生
抚生白乌幽明
体育生白袜飞机
白萝卜生吃好吗
生栗子怎么去皮小妙招
生板栗怎么去皮
生板栗去皮
生板栗里薄皮怎么去掉
如何剥生栗子皮不用加热
生粟子怎么样快去壳皮
一生相随by橘子皮
生栗子怎么去皮
生栗子去皮
荞麦皮枕头生虫虫子图片
生皮
生板栗怎么去皮去壳
荞麦皮枕头生虫
新疆薄皮生核桃
买了皮床生不如死
生的柚子皮煮水止咳的做法
带皮生花生
皮黔生