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
https://oj.leetcode.com/problems/unique-binary-search-trees/
使用动态规划的方法解决:
用tree_num保存n个节点的二叉树个数,对于n个节点的二叉树,有如下公式
tree_num[n] = tree_num[0] * tree_num[n - 1] + tree_num[1] * tree_num[n - 2] + ...+ tree_num[n-2] * tree_num[1] + tree_num[n - 1] *tree_num[0]
1> 使用数组tree_num[] 保存n个节点的二叉树个数,依次计算 tree_num[1], tree_num[2], tree_num[3] ..... tree_num[n]的二叉树个数:
最后删除数组 tree_num, 返回结果。
时间复杂度 O(n * n)
空间复杂度 O(n)
class Solution {
public:
int numTrees(int n) {
//tree_num[n] = tree_num[0] * tree_num[n - 1] + tree_num[1] * tree_num[n - 2] + ...+
// tree_num[n-2] * tree_num[1] + tree_num[n - 1] *tree_num[0]
if (n < 3) {
return n;
}
int *tree_num = new int[n + 1];
tree_num[0] = 1;
tree_num[1] = 1;
tree_num[2] = 2;
for (int i = 3; i <= n; ++i) {
tree_num[i] = 0;
for (int j = 0; j < i; ++j) {
tree_num[i] += tree_num[j] * tree_num[i - 1 - j];
}
}
int retval = tree_num[n];
delete [] tree_num;
return retval;
}
};
2> 使用 vector 代替 tree_num[] 数组.
class Solution {
public:
int numTrees(int n) {
//tree_num[n] = tree_num[0] * tree_num[n - 1] + tree_num[1] * tree_num[n - 2] + ...+
// tree_num[n-2] * tree_num[1] + tree_num[n - 1] *tree_num[0]
if (n < 3) {
return n;
}
std::vector<int> tree_num(n + 1, 0); // n + 1 ints with value 0
tree_num[0] = 1; // with zero node
tree_num[1] = 1; // with one node
tree_num[2] = 2; // with two nodes
for (int i = 3; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
tree_num[i] += tree_num[j] * tree_num[i - 1 - j];
}
}
return tree_num[n];
}
};