题目描述:给定一个整数 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];
}

96题--不同的二叉搜索树(java、中等难度)的更多相关文章

  1. 95题--不同的二叉搜索树II(java、中等难度)

    题目描述:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 . 示例如下: 分析:这一题需要对比LeetCode96题来分析:https://www.cnblogs.com/K ...

  2. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  3. 二叉搜索树(Java实现)

    二叉搜索树基本操作 求树中的结点个数 判断节点是否为空 向树中插入新结点key-value 树中是否存在key 返回树中key对应的value值 先序遍历 中序遍历 后续遍历 层序遍历 求树中key最 ...

  4. leetcode- 将有序数组转换为二叉搜索树(java)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  5. 【LeetCode 96】不同的二叉搜索树

    题目链接 [题解] 我们可以枚举这棵树的根节点在i处. 现在问题就变成. 1..i-1这i-1个节点组成的树和i+1..n这n-i个节点组成的树的个数的问题了. 假设他们俩的结果分别是cnt1和cnt ...

  6. 数据结构-二叉搜索树Java实现

    1,Node.java 生成基础二叉树的结构 package com.cnblogs.mufasa.searchTree; /** * 节点配置父+左+右 */ public class Node{ ...

  7. 有序链表转换二叉搜索树(LeetCode)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  8. LeetCode 把二叉搜索树转换为累加树

    第538题 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 例如: 输入: 二叉 ...

  9. LeetCode第[98]题(Java):Validate Binary Search Tree(验证二叉搜索树)

    题目:验证二叉搜索树 难度:Medium 题目内容: Given a binary tree, determine if it is a valid binary search tree (BST). ...

随机推荐

  1. webstorm-在不删除硬盘文件的条件下移除项目

    一段时间没用之后会忘记如何在webstorm里移除一个项目,要花很长的时间去找到底如何才能移除,所以特地把它记录下来了,方便下次忘记的时候可以查阅 把鼠标移在你要移除的那个项目上然后按下Delete键 ...

  2. 3.7 Go指针

    1. Go指针 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置. Go 语言中使用&作符放在变量前面对变量进行“取地址”操作. 1.指针默认值nil 2.通过&(取地值 ...

  3. 前端知识点也可以当做面试题含vue

    一.webpack3.x打包工具 三大组成结构.package.json.webpack.config.js.serve.js 1.Package.json:下载目录需要的依赖包 2.Webpack. ...

  4. poi--读取不同类型的excel表格

    要想根据不同类型excel表格获取其数据,就要先判断其表格类型 poi-api种方法: getCellType    public int getCellType()        Return th ...

  5. 你还不懂 Tomcat 的优化吗?

    前言 Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet.JSP 程序的首选.相信大家对于 Tomcat 已经是非常熟悉了,本 ...

  6. [原创]RTX使用printf输出后进入hardfault中断的处理方法 - 讨论

    今天我用到RTX里面使用printf ,发现程序死掉了 我发现很多人遇到了这样的问题 找了网上很多的文章,说是这个是RTX的一个先天不足的问题 我发现了正点原子的 原子哥的解决方案,如下所示: --- ...

  7. SpringCloud Alibaba 简介

    SpringCloud Aliababa简介 SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案. 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一 ...

  8. [Objective-C] 001_Hello Objective-C

    "Hello Word"从来都是经典中的经典!今天我们就来个"Hello Objective-C"吧. 启动Xcode(6.3.1),从File菜单中选择New ...

  9. 数据库原理实验指导(三)使用SQL语言进行简单查询【转载csdn】

    --1.查询全体学生的学号和姓名select sno,sname from student --2.查询全体学生的详细记录select * from student --3.查询软件学院的学生姓名,年 ...

  10. Nessus静态ip配置及内网扫描

    环境ubuntu虚拟机,以前linux配置ip都是从/etc/network/interfaces这里面更改,现在要在/etc/netplan下面配置. vim /etc/netplan/01-net ...