热题96不同的二叉搜索树
要点: 首先明白二叉搜索树的定义是:左子树的值小于根节点,右子树的值大于根节点,即中序遍历会读出升序数组,那么我一开始递归的思路就错了
所以这儿根据题解的DP方式叙述一下,令res(n)表示序列为n的数组能够组成的二叉搜索树个数,而序列为n的搜索树又可以分类成根节点为1,2,3,…n的不同二叉搜索树,那么顶点为i,则左子树为(0,i-1),右子树为(i+1,n),这样就能推出递推公式
r e s ( n ) = ∑ i = 1 n r e s ( i − 1 ) ∗ r e s ( n − i ) res(n) = \sum_{i=1}^n res(i-1)*res(n-i) res(n)=i=1∑nres(i−1)∗res(n−i)
int numTrees(int n) {
if(n<=1) //长度小于2直接返回
return 1;
vector<int> res(n+1,0);
res[0]=res[1]=1; //用于递推
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++) //根结点位置不同
{ //找到序列为i的二叉搜索树个数
res[i]+=res[j-1]*res[i-j];
}
}
return res[n];
}