给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1]; // 创建一个长度为n+1的数组dp,用于存储计算结果
dp[0] = 1; // dp[0]初始化为1,表示空树的数量为1
for(int i = 1;i<=n;i++){ // 从1到n进行遍历,计算每个节点数量对应的BST数量
// 注意j<=i中的等于号,考虑到根节点的值与节点数量相等的情况,即左子树或右子树为空
for(int j = 1;j<=i;j++){ // 遍历所有可能的根节点值
// 将左子树和右子树的组合数量相乘,并累加到dp[i]中,得到以i个节点为根的BST数量
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n]; // 返回n个节点的BST数量
}
}
使用动态规划的思想,通过填充一个数组dp
来记录每个节点数量对应的BST数量。
代码中的循环从1到n遍历,对于每个节点数量i,内部循环从1到i遍历,考虑所有可能的根节点值。
在内部循环中,通过累加dp[j-1] * dp[i-j]
,将左子树和右子树的组合数量相乘,并累加到dp[i]
中,得到以i个节点为根的BST数量。
初始时,将dp[0]
设置为1,表示空树的数量为1。
最后,返回dp[n]
,即给定节点数量n的BST数量。
这段代码的时间复杂度为O(n^2),其中n是给定的节点数量。