题目:
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
题解:
将树分成两半,[1,i-1] - i - [i+1,n],i属于[1,n],且为根节点,则左边都比它小,右边都比它大。以i为根节点的子树个数 = 左子树个数 * 右子树个数。递归下去。若start >= end 返回1.
class Solution {
public:
int numTrees(int n) {
int sum = 0;
for(int i = 1; i <= n; i++)
{
int num = numTreesRecursion(1, i-1) * numTreesRecursion(i+1, n);
sum += num;
}
return sum;
}
int numTreesRecursion(int start, int end)
{
if(start >= end)
return 1;
int sum = 0;
for(int i = start; i <= end; i++)
{
int num = numTreesRecursion(start, i-1) * numTreesRecursion(i+1, end);
sum += num;
}
return sum;
}
};
八个月后第二次做:
class Solution {
public:
int numTrees(int n) {
if(!n)
return 0;
int number = 0;
for(int i = 1; i <= n; i++) {
number += numBST(1, i-1) * numBST(i+1, n);
}
return number;
}
int numBST(int start, int end) {
if(start >= end)
return 1;
int sum = 0;
for(int j = start; j <= end; j++) {
sum += numBST(start, j-1) * numBST(j+1, end);
}
return sum;
}
};
Java版:
public class Solution {
public int numTrees(int n) {
if(n == 0)
return 0;
int number = 0;
for(int i = 1; i <= n; i++) {
number += numBST(1, i-1) * numBST(i+1, n);
}
return number;
}
public int numBST(int start, int end) {
if(start >= end)
return 1;
int num = 0;
for(int j = start; j <= end; j++) {
num += numBST(start, j-1) * numBST(j+1, end);
}
return num;
}
}
Python版:
class Solution:
# @return an integer
def numTrees(self, n):
if n == 0:
return 0
number = 0
for i in range(1,n+1):
number += self.numBST(1,i-1) * self.numBST(i+1,n)
return number
def numBST(self, start, end):
if start >= end:
return 1
num = 0
for j in range(start, end+1):
num += self.numBST(start, j-1) * self.numBST(j+1, end)
return num