题目描述:
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:所有的树的数目都等于其左子树的种类数*其右子树的种类数,这个是一个递推关系
当n=0的时候,一颗空树
当n=1的时候,等于其左子树的种类数目*右子树的种类数目,因为左子树的元素数目为0,右子树的元素数目也是0,所以结果是1*1=1,
当n=2的时候,等于以1为根的树的数目+以2为根的树的数目,当以1为根时,其左子树的元素数目为0,因为不会有数比1小,其右子树的元素数目为1,因为比1大的只有2一个数,因此是不是又可以转化为左子树的元素为0的情况和右子树的元素为1的情况,是不是就等于1*1=1,同理以2为根的树的数目计算结果也是1*1=1,和就是2
当n=3的时候,同样也是这么计算,因此我们可以找到一个递推公式

根据上述分析过程,得到如下代码:
class Solution { public: int numTrees(int n) { if(n<0) return 0; if(n==0 || n==1) return 1; vector<int> nums(n+1, 0); nums[0]=1;//代表的是有0个数应该怎么排,因为是空树,所以为1 nums[1]=1;//代表的是有1个数应该怎么排,因为其左子树是1个空树,右子树也是一个空树,所以是1*1=1 //从2开始计算 for(int i=2; i<=n; ++i){ //以1到i中的每个数为根节点,算出来 for(int j=1; j<=i; ++j) nums[i]=nums[i]+nums[j-1]*nums[i-j]; } return nums[n]; } };
来源:CSDN
作者:一个假程序媛
链接:https://blog.csdn.net/sinat_15723179/article/details/81145517