您的位置:首页 > 产品设计 > UI/UE

【LeetCode】Unique Binary Search Trees && II

2014-04-04 15:54 381 查看

参考

http://www.cnblogs.com/remlostime/archive/2012/11/19/2777841.html


http://blog.csdn.net/maqingli87/article/details/8010563

题目描述


Unique Binary Search Trees

 

Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,

Given n = 3, there are a total of 5 unique BST's.
1         3     3      2      1
\       /     /      / \      \
3     2     1      1   3      2
/     /       \                 \
2     1         2                 3



Unique Binary Search Trees II

 

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


题目分析

这是一个动态规划的题目,用递归或循环法都可以,需要注意的,前面计算下来的结果,要记录下来,不要重复计算就可以了。

总结

代码示例


/*
编译环境CFree 5.0
博客地址:http://blog.csdn.net/Snowwolf_Yang
*/
#include
#include
#include
using namespace std;

#if 0
class Solution {
public:
int numTrees(int n) {
vec.resize(n+1);
vec[0] = 1;
return numTreesCore(n);
}
int numTreesCore(int n)
{
if(vec
>0)	return vec
;
int num = 0;
for(int i=0;i vec;
};
#elif 1
class Solution {
public:
int numTrees(int n) {
vec.resize(n+1);
if(n >0)vec[0] = 1;
if(n >0)vec[1] = 1;
if(n >1)vec[2] = 2;
if(n >2)
for(int i=3;i<=n;i++)
{
vec = 0;				//这里需要初始化
for(int j = 0;j[i] vec;
};

#endif
void check(int x,int expected)
{
if(x==expected)
printf("---------------------passed\n");
else
printf("---------------------failed\n");
}
int main()
{
printf("main begin\n");
Solution so;
//check(so.numTrees(1),1);
//check(so.numTrees(2),2);
check(so.numTrees(3),5);
check(so.numTrees(4),14);
//	check(so.numTrees(5),0);
return 0;
}
/*

class Solution {
public:
int numTrees(int n) {
vec.resize(n+1);
return numTreesCore(n);
}
int numTreesCore(int n)
{
if(vec
>0)
{
//printf("*vec[%d] = %d\n",n,1);
return vec
;
}
if(n == 0)
{
vec
= 1;
//printf("0vec[%d] = %d\n",n,1);
return 1;
}
int num = 0;
for(int i=0;i vec;
};
*/



/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode *> generateTrees(int n) {
return generateTreesHelper(1, n);
}
vector<TreeNode *> generateTreesHelper(int begin, int end) {
vector<TreeNode *> ret;
if (end < begin) {
ret.push_back(NULL);
return ret;
}
for (int i = begin; i<= end; i++) {
vector<TreeNode *> left = generateTreesHelper(begin, i - 1);
vector<TreeNode *> right = generateTreesHelper(i + 1, end);
for (int m = 0; m < left.size(); m++) {
for (int n = 0; n < right.size(); n++) {
TreeNode * root = new TreeNode(i);
root->left = left[m];
root->right = right
;
ret.push_back(root);
}
}
}
return ret;
}
};


推荐学习C++的资料

C++标准函数库
http://download.csdn.net/detail/chinasnowwolf/7108919

在线C++API查询
http://www.cplusplus.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 leetcode