96题--不同的二叉搜索树(java、中等难度)
题目描述:给定一个整数 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、中等难度)的更多相关文章
- 95题--不同的二叉搜索树II(java、中等难度)
题目描述:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 . 示例如下: 分析:这一题需要对比LeetCode96题来分析:https://www.cnblogs.com/K ...
- 二叉搜索树Java实现(查找、插入、删除、遍历)
由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...
- 二叉搜索树(Java实现)
二叉搜索树基本操作 求树中的结点个数 判断节点是否为空 向树中插入新结点key-value 树中是否存在key 返回树中key对应的value值 先序遍历 中序遍历 后续遍历 层序遍历 求树中key最 ...
- leetcode- 将有序数组转换为二叉搜索树(java)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- 【LeetCode 96】不同的二叉搜索树
题目链接 [题解] 我们可以枚举这棵树的根节点在i处. 现在问题就变成. 1..i-1这i-1个节点组成的树和i+1..n这n-i个节点组成的树的个数的问题了. 假设他们俩的结果分别是cnt1和cnt ...
- 数据结构-二叉搜索树Java实现
1,Node.java 生成基础二叉树的结构 package com.cnblogs.mufasa.searchTree; /** * 节点配置父+左+右 */ public class Node{ ...
- 有序链表转换二叉搜索树(LeetCode)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- LeetCode 把二叉搜索树转换为累加树
第538题 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和. 例如: 输入: 二叉 ...
- LeetCode第[98]题(Java):Validate Binary Search Tree(验证二叉搜索树)
题目:验证二叉搜索树 难度:Medium 题目内容: Given a binary tree, determine if it is a valid binary search tree (BST). ...
随机推荐
- Python中的时间与日期
本文简要介绍datetime,time模块的简要用法. datetime模块 datetime模块主要有四个主要的对象. date 处理年.月.日 time处理时.分.秒.微秒 datetime处理日 ...
- 深入Spring之IOC之加载BeanDefinition
本文主要分析 spring 中 BeanDefinition 的加载,对于其解析我们在后面的文章中专门分析. BeanDefinition 是属于 Spring Bean 模块的,它是对 spring ...
- Jenkins 插件 Role Strategy Plugin 使用
Manage and Assign Roles 1. Manage Roles Global Role 在此处,我们划分了四种权限,分别为: admin:超级管理员角色,管理整个服务: devops: ...
- 14.5 Go 爬虫
14.5 Go 爬虫 爬虫库/框架 henrylee2cn/pholcus 幽灵蛛 星5200 gocrawl 星1700 colly 星7169 hu17889/go_spider 星1400 go ...
- 新概念英语三 新东方主讲Lesson1
新概念二 Lesson95 词汇 ①get a shock 吓了一跳,得到一个惊喜 例:his wife got a shock get into a such mess 这么不幸搞得一片狼籍弄得这样 ...
- 【NLP】老司机带你入门自然语言处理
自然语言处理是一门用于理解人类语言.情感和思想的技术,被称为是人工智能皇冠上的明珠. 随着深度学习发展,自然语言处理技术近年来发展迅速,在技术上表现为BERT.GPT等表现极佳的模型:在应用中表现为c ...
- json和数组
接触数组: 1.数组的定义方法 var arr = [1,2,3,4,5]; var arr = new array();此处括号内可以填写数组的元素,或者直接填写元素的个数.2.数组中各 ...
- Dubbo源码阅读-服务导出
Dubbo服务导出过程始于Spring容器发布刷新事件,Dubbo在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装URL.第二部分是导出服 ...
- 校园网络 luogu P2812 (又是强联通)
题目传送门!(luogu) 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这 ...
- echarts实现漏斗转化率图表效果
1.在用echarts实现图表的旅途中遇到这样一个需求,用柱图展示漏斗转化效果,下图展示: 别的不多说了,就说解决方式吧,用的series中的markpoint来实现. option.series[0 ...