LeetCode 96. 不同的二叉搜索树
问题描述

解题思路
利用动态规则进行解题
对于求解不同的二叉搜索树,我们可以列举所有节点都当作根节点的情况,对每种情况的所构成的二叉搜索树的数量进行求和,
我们现在假设n=7,分别列举1到7当作根节点的二叉搜索树的情况,根据二叉搜索树的特性,我们可以得知,左子树的所有节点是小于根节点的,右子树的所有节点是大于根节点的。我们求每种情况所能形成二叉搜索树的个数时就用左子树的节点数所能构成二叉搜索树的数量乘右子树的节点数所能形式二叉搜索树的数量,假设现在让n=7让4当作根节点,左子树的所有节点必须都小于根节点4的,也就有三个节点13共有三个节点,右子树所有节点必须都大于根节点4,也就是57共有三个节点,当根节点为4所有二叉搜索树的情况是,左子树节点的个数所能形成二叉搜索树的个数乘以右子树节点的个数所能形成二叉搜索树的个数,dp[4]=dp[3]*dp[3]。这里我们明确一下dp[i]的含义是当有i个节点所有构成二叉搜索树的数量是dp[i]。
代码实现
public class Solution {
public int numTrees(n) {
int[] dp = new int[n+1];
dp[0]=1;
dp[1]=1;
for (int i=2; i<=n; ++i) {
for (int j=1; j<=i; ++j) {
dp[i] += dp[j-1] * dp[i-j];
}
}
}
}

浙公网安备 33010602011771号