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

[leetcode] 96.Unique Binary Search Trees

2015-06-26 17:04 351 查看
题目:

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

题意:

给一个数字n,使用[1,2…n]的数字构造二叉搜索树,一共可以构造出多少种。以上例子是当n=3

时,一共有五种可能。

思路:

分析题目的意思在[1,2…n]的数列中,可以随机挑一个作为树的跟,那么会有n种树的跟的情况。如果挑的数字是k,那么以k作为根的树的左子树上的节点应该是包含[1,..k-1],右子树上的节点是[k+1,..n]。如果是在序列[i…j]中,可以作为根节点的一共有j - i 种可能,每一种可能将序列截成两段,左边与右边各一段,选取k作为根节点,如果右边一段有m种构造树的可能,右边有n种构造树的可能,那么选取k作为根节点会产生树的可能是m*n。如果k==i或者k==j,则对应是n,m种可能。

可以找出状态转移方程:

DP[i][j] += DP[i][k-1]*DP[k+1][j] (k=i+1,…j-1)

DP[i][j] += DP[i+1]j

DP[i][j] += DP[i]j-1

可以发现,对于所要求的DP[i][j],依赖于DP[i][i]到DP[i][j-1],以及DP[i][j]到DP[j][j]。即如下图所示:



蓝色的区域DP[0][2]是需要计算的,那么它的计算就需要依赖于已经计算出来的橙色区域中的DP[0][0],DP[0][1],DP[1][2],DP[2][2],即该元素所在行的左边的元素,以及该元素所在行列的下方元素。

以上。

代码如下:

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