https://leetcode.com/problems/unique-binary-search-trees/description/
因为对于任何一个形态只有一种数字排列方式,所以这道题的本质是求可能的二叉查找树的形态总数。
具体解法是任选一个节点做根节点,将左右两边可能的二叉树形态的数目相乘得到一个结果数。按照以上方法遍历所有的节点并累加即可。可以采用动态规划的方法,用一个res数组保存从0到n个节点对应的结果数;遍历的时候直接查询结果即可。另外,本题也是一个经典的卡特兰数问题,所以也可以直接用卡特兰数的通项公式求解。
以下为C++代码,时间复杂度为,空间复杂度为O(n)。
class Solution {
public:
int numTrees(int n) {
if (n == 0)
return 0;
vector<int> res;
res.push_back(1);
res.push_back(1);
for (int i = 1; i<n; ++i) {
res.push_back(0);
for (int j = 0; j<=i; ++j)
res[i+1] += res[i-j]*res[j];
}
return res[n];
}
};
class Solution:
def numTrees(self, n):
if n is None or n == 0:
return 0
res = [1, 1]
i = 0
for i in range(2, n+1):
res.append(0)
j = 0
for j in range(0, i):
res[i] = res[i] + res[j] * res[i-j-1]
return res[n]