问题
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
例子
思路
动态规划
i
个
节
点
存
在
二
叉
排
序
树
的
个
数
:
f
(
i
)
=
g
(
1
)
+
g
(
2
)
+
.
.
+
g
(
i
)
g
(
j
)
以
j
为
根
节
点
的
情
况
g
(
j
)
=
f
(
j
−
1
)
f
(
i
−
j
)
以
j
为
根
节
点
,
因
为
是
二
叉
搜
索
树
,
则
左
子
树
为
1
j
−
1
,
有
j
−
1
个
数
,
右
子
树
为
j
+
1
i
,
有
i
−
j
个
数
f
(
i
)
=
f
(
0
)
f
(
i
−
1
)
+
f
(
1
)
f
(
i
−
2
)
+
.
.
+
f
(
i
−
1
)
f
(
0
)
f
(
0
)
为
1
i个节点存在二叉排序树的个数:\\ f(i)=g(1)+g(2)+..+g(i)~~g(j)以j为根节点的情况\\ g(j)=f(j-1)f(i-j)~~以j为根节点,因为是二叉搜索树,则左子树为1~j-1, 有j-1个数,右子树为j+1~i,有i-j个数\\ f(i)=f(0)f(i-1)+f(1)f(i-2)+..+f(i-1)f(0)~~ f(0)为1
i个节点存在二叉排序树的个数:f(i)=g(1)+g(2)+..+g(i) g(j)以j为根节点的情况g(j)=f(j−1)f(i−j) 以j为根节点,因为是二叉搜索树,则左子树为1 j−1,有j−1个数,右子树为j+1 i,有i−j个数f(i)=f(0)f(i−1)+f(1)f(i−2)+..+f(i−1)f(0) f(0)为1
-
方法2
代码
//方法1
class Solution {
public int numTrees(int n) {
int[] res = new int[n+1];
res[0]=1;
//res[i]以1..i为节点组成的二叉搜索树有多少种
for(int i=1; i<=n; i++) {
//j为根节点是第几个,则左子树有j-1个节点,右子树有i-j个节点
for(int j=1; j<=i; j++) {
res[i]+=res[j-1]*res[i-j];
}
}
return res[n];
}
}
//方法2