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 个结点的二叉树共有多少种不同的结构。
思路一:当有
class Solution {
public:
int numTrees(int n) {
// 节点数小于等于1时只能形成一种形状的二叉树
if (n <= 1) return 1;
int sum = 0;
for (int i = 1; i <= n; i++) {
// 枚举二叉树的左右节点数,递归;结果相乘
sum += (numTrees(i-1) * numTrees(n-i));
}
return sum;
}
};
思路二:不难发现上述思路存在许多重复计算的情况,可以使用动态规划进行优化。维护一个数组
dp[]
,其中
dp[i]
表示有
i
个结点时能产生的二叉搜索树的个数,则
dp[i]={1,∑i−1j=0dp[j]∗dp[i−j−1],if n=0 or n=1if n≥2
代码如下:
class Solution {
public:
int numTrees(int n) {
int dp[n+1];
dp[0] = dp[1] = 1; // 节点数小于等于1时只能形成一种形状的二叉树
// 依次求出结点数为2, ..., n时可以形成的二叉树个数
for (int i = 2; i <= n; i++) {
dp[i] = 0;
// 枚举二叉树的左右节点数,递归;结果相乘
for (int j = 0; j < i; ++j) {
dp[i] += (dp[j] * dp[i-j-1]);
}
}
return dp[n];
}
};