您的位置:首页 > 产品设计 > UI/UE

Unique Binary Search Trees (leetcode)

2014-10-29 21:40 274 查看
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
= 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
的二叉树个数:

最后删除数组 tree_num, 返回结果。

时间复杂度 O(n * n)

空间复杂度 O(n)

class Solution {
public:
int numTrees(int n) {
//tree_num
= 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
;
delete [] tree_num;
return retval;
}
};


2> 使用 vector 代替 tree_num[] 数组.

class Solution {
public:
int numTrees(int n) {
//tree_num
= 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
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: