LeetCode 96. 不同的二叉搜索树

删除回忆录丶 提交于 2019-11-29 23:21:23

题目描述:

给定一个整数 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];     } };

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!