- 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 19
题解
非常美妙的动态规划,我们一开始是太过分计较二叉树节点的数值关系了,现在抛开这个数据关系,因为题目说了每个节点的数据都是1-n恰好n个节点,所以我随机从这些节点中拿出来m个,问这m个能构成多少种不同的二叉搜索树,其实和问n个节点能构成多少不同的二叉搜索树答案是一样的。
于是我们的问题可以变成dp[x]表示x个节点能构成的方案数,那么当n=5时,答案就有,每次固定一个根节点:
res = 0
1.左子树0个节点,右子树4个节点
res+=(dp[0]*dp[4])
2.左子树1个节点,右子树3个节点
res+=(dp[1]*dp[3])
3.左子树2个节点,右子树2个节点
res+=(dp[2]*dp[2])
4.左子树3个节点,右子树1个节点
res+=(dp[3]*dp[1])
5.左子树4个节点,右子树0个节点
res+=(dp[4]*dp[0])
答案是不是就很简单了,真的是很美妙。
AC代码
class Solution {
public:
int dp[20];
int numTrees(int n) {
dp[1]=dp[0]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<i;j++)
dp[i] += (dp[j]*dp[i-j-1]);
}
return dp[n];
}
};