leetcode96-不同的二叉搜索树
96. 不同的二叉搜索树
首先,二叉搜索树的基本性质:对于某个结点,若有左孩子,那么它的左孩子比它小。若有右孩子,那么右孩子比它大。
这里的dp[n]数组表示从1,...,n可以构成多少个二叉搜索树。
sum+=(dp[j]*dp[i-j-1]),以求解dp[10]为例
表示 顶点左边0个结点,右边9个结点、 左边1个结点,右边8个结点、 左边2个结点,右边7个结点、...、 左边9个结点,右边0个结点的所有情况
这个可以1为顶点 这个可以2为顶点 这个可以3为顶点 这个可以10为顶点
比如这个右边7个,即【4,10】的组合和【1,7】的组合是等价的
class Solution {
public:
int numTrees(int n) {
if(n==1) return 1;
vector<int> dp(n+1,0);
dp[0]=1;dp[1]=1;dp[2]=2;//这里为了方便,把空子树也当作一种情况
for(int i=3;i<=n;i++)
{
int sum=0;
for(int j=0;j<=i-1;j++)
{
sum+=(dp[j]*dp[i-j-1]); //比如求dp[10],就将dp[0]*dp[9],dp[1]*dp[8],dp[2]*dp[7],...,dp[8]*dp[1],dp[9]*dp[0]相加
}
dp[i]=sum;
}
return dp[n];
}
};