- 描述
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
思路
这道题和LeetCode上面的95题几乎一样,但是这道题更加简单,因为只需要求解个数。这道题显然可以使用递归的思路去解决,但是可能递归算法的效率没有递推算法高。因此这里决定使用递推的方法。
递推的思路可以这样去求解,n个数字的情况有这样几种情况:左边有n-1,右边为0个节点;左边有n-2个节点,右边有1个节点;左边有n-m个节点,右边有 m-1个节点,直到m=n,我们如果需要求n,就要先求出n-1等情况。因此我们可以先求出r=1时、然后就r=2,继续求r=3直到r=n。代码见下。- 代码(c#)
public int NumTrees(int n)
{
if (n == 0) return 0;
int[,] arr = new int[n + 1, n + 1];//使用二维数组记录已求解的情况个数
arr[0, 0] = 1;//左右节点都没有,只有1中情况
arr[1, 0] = 1;//只有一个右节点,1种情况
arr[0, 1] = 1;//只有一个左节点,1种情况
for (int i = 2; i <= n; i++)
{
for (int j = 0; j < i; j++)
{
int result = 0;
if (j != 0 && (i - j - 1) != 0)
{
result = arr[j, 0] * arr[0, i - j - 1];//左右两边都有节点,那该节点共有左边*右边种情况
}
else
{
result = arr[j, i - j - 1];
}
arr[0, i] += result;//将所有的可能情况相加
}
arr[i, 0] = arr[0, i];//左边有i个节点情况=右边有i个节点的情况
}
return arr[0, n];
}