题目描述:给定一个整数 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. Oracle SQLPlus导出数据到csv文件

    时不时地我们需要导出一些数据用作备份.查看报表等,如果用Sql Developer导出会非常慢.而用SqlPlus,则速度非常快. 准备SQL执行文件export.sql: set colsep , ...

  2. Elasticsearch URI search 查询语法整理

    Elasticsearch URI search 一.请求体查询与空查询 1. 请求体查询(request body search) 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如 ...

  3. iOS [AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selector sent to

    AFN更新到4.0.1后,崩溃[AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selecto ...

  4. poj3249 拓扑找最长路

    Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11230   Accepted: 2651 Des ...

  5. 4、Servlet中的Cookie 用于存储 web 页面的用户信息。

    Servlet Cookie 处理 Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息.Java Servlet 显然支持 HTTP Cookie. 识别返回用户包括三个步骤: 服务 ...

  6. SQL——处理列中NULL值

    处理NULL值 - 数据库中某列为NULL值,使用函数在列值为NULL时返回固定值.    SQLServer:ISNULL(col,value)        示例:SELECT ISNULL(co ...

  7. Java-LinkedList围圈的人名

    import java.util.*; public class Example12_7 { public static void main(String[] args) { int m=5; Lin ...

  8. JAVA自学笔记(4)

    发现JAVA的有趣 Day1 继承不是"继承" 1.0 继承的格式 public class FU { public void method() { System.out.prin ...

  9. Chisel3 - Tutorial - VendingMachine

    https://mp.weixin.qq.com/s/tDpUe9yhwC-2c1VqisFzMw   演示如何使用状态机.   参考链接: https://github.com/ucb-bar/ch ...

  10. jchdl - RTL实例 - MOS6502 ALU

    https://mp.weixin.qq.com/s/nMxYVC2djk7DdAforerZPA   使用jchdl RTL实现MOS6502 CPU的ALU.   参考链接 https://git ...