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

Unique Binary Search Trees

2014-01-03 23:10 197 查看
Problem: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.



初看这道题目,感觉既然给定了N,要求计算出不同形状的树的个数,略像找规律题......好吧,这条路我没走下去(大家有这个思路的,欢迎交流啊)。分析了一下后,我认为,既然给定了节点数N,就给定了树深,根据这个树深,建一个完全二叉树,然后从中选取n个节点满足:1.包含根节点
2.连通条件。这个思路只要求我们实现三个子功能即可,建完全二叉树,选节点包含根节点且连通,在进一步分析后,发现,前两个条件都容易满足,但第三个(连通),不是说不能,是有难度,略复杂。
对于N个节点而言,首先我们确定根节点,就剩下N-1个节点,分布在根节点的左右子树上,则左子树的节点数k可能是(0~N-1)个,右子树为N-1-k个节点,所以
f[0]=1;
for(k=1;k<=n-1;k++)
f
+=  f[k]*f[n-1-k];


如果是以我的思路来说,这必须是递归求解啊,边界条件是f[0]=1;(k=0时),f函数是求n个节点时BST的个数。
但是,经过和同学的讨论,觉得可以用一种反向的方法,从f[0]求起,不理会一开始要求求的n的BST个数,而是求出0~n个节点的每个节点的BST数,并存在数组中,这样,在程序一次运行中,可以避免重复求f[k]。
代码如下:
class Solution {
public:
int numTrees(int n) {
int f[100] = {0};
f[0] = 1;
for(int j=1;j<=n;j++) {
for(int k=0;k<=j-1;k++)
f[j] += f[k]*f[j-1-k];
}
return f
;
}
};


个人感觉这种方法是从底向上,递归是从顶向下,很相似。好吧,原来这个叫递推,它的空间复杂度比递归较大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm