题目:
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 = 0
,树为空,只有1种结构, d[0]=1 ;n = 1
,只有一个根结点的单结点树,也是只有1种结构, d[1]=1 ;n = 2
,两个结点,有两种结构,“1”为根结点,或者“2”为根结点, d[2]=2 ;分析题目中
n = 3
的情况:- “1”为根结点,左子树为空,右子树结点数为2,所以共有 d[0]×d[2] ;
- “2”为根结点时,左子树和右子树结点数均为1,所以共有 d[1]×d[1] ;
- “3”为根结点,左子树结点数为2,右子树为空,所以共有 d[2]×d[0] ;
综上,所以
n = 3
时, d[3]=d[0]×d[2]+d[1]×d[1]+d[2]×d[0]=5 ;分析
n = 4
的情况:- “1”为根结点,左子树为空,右子树结点数为3,所以共有 d[0]×d[3] ;
- “2”为根结点时,左子树结点数为1,右子树结点数均为2,所以共有 d[1]×d[2] ;
- “3”为根结点,左子树结点数为2,右子树结点数为1,所以共有 d[2]×d[1] ;
- “4”为根结点,左子树结点数为3,右子树为空,所以共有 d[3]×d[0] ;
综上,所以n = 4
时,
d[3]=d[0]×d[3]+d[1]×d[2]+d[2]×d[1]+d[3]×d[0]
;
至此,我们总结出状态转移方程:
d[i]=⎧⎩⎨⎪⎪⎪⎪1,2,∑j=0,k=i−1j=i−1,k=0d[j]×d[k],i=0或1;i=2;i>2;
C++代码:
class Solution {
public:
int numTrees(int n) {
int d[100]={1,1,2};
for(int i=3;i<=n;i++)
{
for(int j=0,k=i-1;j<i,k>=0;j++,k--)
{
d[i] += d[j]*d[k];
}
}
return d[n];
}
};