题目
-
Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?
-
Example:
Input: 3
Output: 5
Explanation:
Given n = 3, there are a total of 5 unique BST’s:
题意:给定数n ,二叉树的结点的值分别为1,2… …n。问能组成多少种不同的二叉搜索树。
二叉搜索树的性质: 在任一结点r的左(右)子树中,所有结点(若存在)均小于(大于)r。更一般性的特点是:任何一颗二叉树是二叉搜索树,当且仅当其中序遍历序列为单调非降。
基础知识一定要扎实,不然看到这题懵逼。。。
-
方法一: 递归
思路: 空树和只有根节点时,也为BST。对于一点i,当其为根节点时,左子树的节点的个数为 i - 1,(为 1,… n-1),右子树为 n-i(i+1, … n)。对于一个根来说,唯一二叉树的个数为左子树结点的个数乘以右子树结点的个数。而根节点可以从1到n中选择。 -
在这里我报了Time Limit Exceeded错误。
class Solution{
public:
int numTrees(int n)
{
if(n <= 1) return 1;
int sum = 0;
for(int i = 1; i <= n; i++)
{
sum += numTrees(i - 1)*numTrees(n - i);
}
return sum;
}
}
- 方法二:
还有大神说这是Catalan Number卡特兰数的一个例子。卡特兰数的的递推公式:
可以使用动态规划解决问题。维护向量sumNode,sumNode[i]为结点个数为i时,唯一二叉搜索树的个数。和这题相对应的意义,可以写出n较小的情况。
- 时间上每次求解i个结点的二叉查找树数量的需要一个i步的循环,总体要求n次,所以总时间复杂度是O(1+2+…+n)=O(n^2)。空间上需要一个数组来维护,并且需要前i个的所有信息,所以是O(n)。"
class Solution {
public:
int numTrees(int n)
{
vector<int> sumNode(n+1,0);
sumNode[0]=1;
sumNode[1]=1;
for(int i=2;i<=n;++i)
for(int j=0;j<i;++j) //j符合条件时,最大为i-1,对照公式
sumNode[i]+=sumNode[j]*sumNode[i-j-1];
return sumNode[n];
}
};