题目描述:给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例如下:

分析:本题可用动态规划的方法求解。

  设 dp[n] 表示以 1 ... n 为节点组成的二叉搜索树的种类,我们做如下讨论:

1)当头结点的值为1时,左子树为空,即左子树可能出现的二叉搜索树的结构数为1。右子树上有(n - 1)个结点,此时右子树(n-1)个结点可能组成的二叉搜索树的个数为 dp[n-1]。

那么总的可能出现的二叉搜索树的结构数 dp[n] = 左子树可能结构数 * 右子树可能结构数 = 1 * dp[n-1]

2)当头结点的值为 i (1 < i < n) 时,左子树的结点为:1 —> i-1  ,这 (i-1) 个结点可能组成的二叉搜索树的个数为 dp[i-1];右子树的结点为:i+1 —> n  ,这 (n-i) 个结点可能组成的二叉搜索树的个数为 dp[n-i].

那么,左右子树以及头结点 i 组成的二叉搜索树可能的结构种类为:dp[i] = dp[i-1] * dp[n-i]

3)当头结点的值为n时,右子树为空,左子树上有(n - 1)个结点,此时左子树(n-1)个结点可能组成的二叉搜索树的个数为 dp[n-1];

那么总的可能出现的二叉搜索树的结构数 dp[n] = dp[n-1] * 1

  另外,n = 0 时 dp[0] = 1,因为空树也算一种二叉搜索树;那么n = 1时的情况可以看做是其左子树可能结构数乘以右子树可能结构数,左右字数都是空树,所以1乘1还是1,dp[1]=1。

  终上所述:dp[n] = dp[0] * dp[n-1] + dp[1] * dp[n-2] + ...... + dp[i-1]*dp[n-i] + ...... + dp[n-2] * dp[1] + dp[n-1] * dp[0] 。这实际上是一个卡特兰数问题。

  

  那么,根据以上递推公式,我们可以从0开始,求得每一个 dp[i],这样就可以递推得到dp[n],这种方法的时间复杂度是 O(n^2) ,因为代码内部有2层循环。

  代码如下(java语言):

     public int numTrees(int n)
{
//定义一个长度为 n+1 的数组,用于存储 dp[1] - dp[n]
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1; //通过2层循环,i=2,...,n 找到每一个dp[i]
for (int i = 2; i <= n ; i++)
{
for (int j = 0; j <= i-1 ; j++)
{
dp[i] += dp[j] * dp[i-j-1];
}
} return dp[n];
}

最新文章

  1. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
  2. 第六百零九天 how can I 坚持
  3. iOS 和 Android 测试托管平台 FIR.im 的注册与常用功能
  4. ifconfig 工具
  5. mysql中如何嵌套使用insert和select
  6. Kafka与Logstash的数据采集
  7. INSERTION_SORT插入排序C++实现
  8. 解决升级Xcode后插件不能使用的问题
  9. iOS 之使用CAShapeLayer中的CAGradientLayer实现圆环的颜色渐变
  10. Oracle 调用存储过程执行CRUD的小DEMO
  11. C 这些东西的内存管理
  12. javascript string对象方法总结
  13. C#微信公众号——本地调试
  14. javascript、ruby和C性能一瞥(1)
  15. Tupper自我指涉公式生成器
  16. slf4j的使用
  17. css absolute同时设置top bottom
  18. mybatis二级缓存详解
  19. js layer.js
  20. 字符串加密解密(Base64)

热门文章

  1. java 面向对象面试题,问答题,构造方法,抽象类,继承,多态,接口,异常总结;
  2. oracle 查询表及字段结构
  3. 解决el-tree横向滚动条问题
  4. Poj1328 用雷达覆盖所有的岛屿
  5. .NET Core HttpClientFactory+Consul实现服务发现
  6. MySQL 8.0用户及安全管理
  7. Java——使用ObjectMapper.writeValueAsString时报错The type com.fasterxml.jackson.core.JsonProcessingException cannot be resolved. It is indirectly referenced from required .class files
  8. vue npm run dev报错webpack-dev-server
  9. Android_存储之文件存储
  10. [JavaWeb基础] 003.JAVA访问Mysql数据库