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

096 Unique Binary Search Trees [Leetcode]

2015-09-04 17:41 549 查看
题目内容:

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.

思路:

还是递归的思路。关于树的题目,基本都能够从把一棵树分解成左右子树这样的子问题进行求解。这个题也不例外。

因为限定的条件是左右子树,一开始非常困惑找不到切入点,虽然知道可以分解为左右子树的子问题,但对于子问题的求解方式,也就是子树个数的计数感到困惑。如何统计unique的种数呢?

题目中还有一个条件没有被用到。那就是要构建的是一棵特殊的树——binary search tree。也就是说,所有左子树的节点小于根节点,所有右子树上的节点大于根节点。以[1, …, n]为基础构建BST时,如果选定了以i为根,那么左子树上的节点就是[1, 2, …, i-1],构成右子树的节点就是[i+1, i+2, …, n]。这样子问题就完全符合了。

下面自底向上观察子问题的求解。

当节点个数为0时,也就是空树,那么毫无疑问f(0) = 1.

当节点个数为1时,情况也唯一,f(1) = 1.

当节点个数大于等于2时,问题就变得有趣了。一棵树可以分解为左子树和右子树,而它的构成种数也就是(左子树的构成种数*右子树的构成种数)。假设有n个节点,那么他的子树中的节点有n-1个。左子树的节点个数可以是从0~n-1个,相对应的右子树的节点个数就是n-1~0个。

也就是说,f(n) = ∑ f(i) * f(n-1-i) 0 <= i < n-1

代码的思路很清楚了。

代码如下,运行时间0ms:

class Solution {
public:
int numTrees(int n) {
if(n == 1)
return 1;

vector<int> f(n+1, 0);
f[0] = f[1] = 1;
for(int i = 2; i <= n; ++i) {
for(int j = 0; j < i; ++j) {
f[i] += f[j]*f[i-j-1];
}
}
return f
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: