题目:
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例:
题目链接:96. 不同的二叉搜索树 - 力扣(LeetCode)
递推关系的推导:
n=3时,如上图所示。
当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,和 n 为2的时候两棵树的布局是一样的。
当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,和n为2的时候两棵树的布局也是一样的。
当2为头结点的时候,其左右子树都只有一个节点,布局和n为1的时候只有一棵树的布局也是一样的。
dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量
元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量
元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量
元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量
有2个元素的搜索树数量就是dp[2]。
有1个元素的搜索树数量就是dp[1]。
有0个元素的搜索树数量就是dp[0]。
所以
解法:
class Solution {
public:
int numTrees(int n)
{
//dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。
vector<int> dp(n + 1);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
};