96. 不同的二叉搜索树
题目来源
96. 不同的二叉搜索树
题目描述
题目解析
动态规划
假设n
个节点存在二叉排序树的个数是G(n)
,令f(i)
是以i为根的二叉搜索树的个数,则有
G ( n ) = f ( 1 ) + f ( 2 ) + f ( 3 ) + . . . f ( n ) G(n)=f(1)+f(2)+f(3)+…f(n) G(n)=f(1)+f(2)+f(3)+…f(n)
n为根节点,当i为根节点时,其左子树节点个数为[1,2,3...i-1]
,右子树节点个数为[i+1, i+2,... n]
,所以当i为根节点时,其左子树节点个数为i-1
个,右子树节点为n-i
个,即f(i) = G(i-1)*G(n-i)
。因此
G ( n ) = G ( 0 ) ∗ G ( n − 1 ) + G ( 1 ) ∗ G ( n − 2 ) + . . . + G ( n − 1 ) ∗ G ( 0 ) G(n) = G(0)*G(n-1)+G(1)*G(n-2)+…+G(n-1)*G(0) G(n)=G(0)∗G(n−1)+G(1)∗G(n−2)+…+G(n−1)∗G(0)
class Solution {
public int numTrees(int n) {
int [] ints = new int[n + 1];
ints[0] = 1;
ints[1] = 1;
for (int i = 2; i <= n; i++){
for (int j = 1; j <= i; j++){
ints[i] += ints[j - 1] * ints[i - j];
}
}
return ints[n];
}
}
还没有评论,来说两句吧...