题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?...

题目一:给出一个n,代表有从1到n的数字[1,2,3,··· n],问可以构成多少种二叉搜索树?

一开始的想法是直接递归构造,时间复杂度是指数上升;
后来想法是找规律:
先看例子:

n = 1, 有一个元素,可以构成一个二叉搜索树,左右都没有元素,总数量 = 左子树数量 右子树数量,记为f(1) = f(0) f(0) = 1,这儿可以将f(0)初始化为1;
n = 2, 1做根,那么左子树没有元素记为f(0),右子树有一个元素记为f(1), 2做根,左子树有一个元素,记为f(1),右子树没有元素记为f(0);
总共:f(2) = f(0) f(1) + f(1) f(0) = 2;
n = 3, 1做根,数量 = f(0) f(2), 2做根 数量 = f(1) f(1), 3做根, 数量 = f(2) f(0);
总共 f(3) = f(0) f(2) + f(1) f(1) + f(2) f(0) = 5;
可以看出f(n),依赖与f(0)到f(n-1),换句话说可以有前面的n-1项推导出第n项;
分析关系表达式:
记h(k)为以k为根可以生成的二叉搜索树数量;
当以k为根时,他的左子树为[1,2 ··· k-1]构成,也就是左子树有k-1个元素构成,这个就可以记为f(k-1);
右子树为[k+1 ··· n]构成,也就是右子树有n-k个元素构成,这个可以记为f(n-k);
那么h(k) = f(k-1) * f(n-k); 要记得k的范围可以从1到n;
整合以上规律可得到:有n个元素的二叉搜索树的数量;f(n) = h(1)+h(2)+···+h(n) = ∑ h(k) ,0 < k <= n;
又因为h(k) = f(k-1) f(n-k)得到:f(n) = ∑ f(k-1) f(n-k); 0 < k <= n;
代码:输入n,输出可以构造出的二叉搜索树的数量;
时间复杂度O(n^3);

private static int BSCount(int n) {int[] res = new int[n+1];res[0] = 1;for(int i = 1; i<=n; i++) {for(int k=1; k<=i; k++) {res[i] += res[k-1] * res[i-k];
//				System.out.println(i + " k:" + k +" " + res[i]);}}return res[res.length-1];}

  注释:第一个循环用来控制根节点肯能出现的情况。因为这是一个递归表达式,第二个循环是用来控制计算以当下值为根节点的时候,所以依赖的前面表达式的值是多少。

      比如计算以当n3的时候,需要计算一下三种情况:

          res[3]+=res[0]*res[2]  (以1为根节点时)

          res[3]+=res[1]*res[1]  (以2为根节点时)

          res[3]+=res[2]*res[0]  (以3为根节点时)

      那么,这些表达式中的res[1]和res[2]需要提前计算。这个是由第二个循环来完成的。

转载于:https://www.cnblogs.com/lyr2015/p/10147906.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(124):小综合案例

public class Province {private String name;//省份名称private long area;//土地面积private boolean general;//是普通省份还是特殊省份public String getName() {return name;}public void setName(String name) {this.name name;}public long getArea() {return area;}pu…

论文发表在什么期刊上_医学论文发表期刊论文范文

普通期刊是国内期刊中底数最多、选择范围最广、受众最广的期刊类型。这对国内作家来说一定不陌生。选择出版普通期刊的作者总是很多&#xff0c;无论是大学生还是发表专业职称的专业人士。写普通期刊并不难。普通期刊对论文的要求大多是论文的基本要求&#xff0c;大多数人都能…

[Docker]Docker拉取,上传镜像到Harbor仓库

需求因为项目的需求,需要制作一个基于tomcat的镜像.那么前提就是,需要有tomcat的基础镜像. 怎么做我的思路跑偏了,本来以为是需要将tomcat下载下来,然后通过docker命令,让它成为镜像的.结果后来和老大一沟通,才发现自己的思路偏的不是一点儿半点儿 如果需要tomcat镜像,可以从Do…

java学习(125):简单异常处理

//异常处理 import java.util.Scanner; public class test65 {public static void main(String[] args){int a,b,c;Scanner innew Scanner(System.in);try {System.out.println("亲输入a的值");ain.nextInt();System.out.println("请输入b的值");bin.nextI…

python免费下载及安装_Python的下载及安装

Python下载可以在百度查找“Python下载”&#xff1a;或者直接搜索此网址&#xff1a;https://www.python.org/getit/在官网有python2和python3可供选择&#xff0c;我下载的是python3&#xff1a;下载完安装包后开始安装&#xff1a;选择Install Now那么就直接安装&#xff1a…

面试题5,接口和抽象类的区别

转载于:https://www.cnblogs.com/fuckingPangzi/p/10153501.html

玩转oracle 11g(18):数据库相关日志文件位置

数据库相关日志文件 10g 相关路径 警告日志 D:\oracle\product\10.2.0\admin\docare\bdump\alert_docare.log 监听日志文件 D:\oracle\product\10.2.0\db_1\network\log文件 监听配置文件、TNSNAMES.ORA配置文件 D:\oracle\product\10.2.0\db_1\network\admin文件夹 11g 相关…

悬浮窗_华为手机悬浮窗设置在哪里

在我们的手机上&#xff0c;应用有很多&#xff0c;现在很多的直播软件都是可以开启小窗功能的&#xff0c;当然了&#xff0c;假如我们的手机假如是华为手机的话&#xff0c;我们也是可以开启应用的悬浮窗功能的&#xff0c;一起了解下&#xff1a;华为手机悬浮窗设置在哪里。…

玩转oracle 11g(19):ora-00020和64位数据库安装32为plsql

1. 64bit 下使用 PLSQL Developer 操作步骤 1.把instantclient-basic-win32-11.2.0.1.0压缩包中文件夹instantclient_11_2 复制到 C:\ 2.把D:\oracle\product\10.2.0\db_1\ 路径下的NETWORK文件夹复制到 C:\ instantclient_11_2\ 3. 系统环境变量 PATH 最右边添加 ; …

iOS----------Apple id如何关闭双重认证?

https://www.zhihu.com/question/292819209转载于:https://www.cnblogs.com/KiVen2015/p/10154609.html

布尔运算_3dmax教程 - 布尔运算

布尔运算 - 创建匹配框在本教程中&#xff0c;我们将通过创建几个框并使用布尔运算来减去框的内部来创建一个匹配框。布尔运算非常有创意且使用起来很有趣。请享用&#xff01;步骤1。打开3ds Max&#xff0c;从新页面开始&#xff0c;并将其保存在3ds Max中作为布尔框的场景文…

玩转oracle 11g(20):ora-00604和ora-00018

3. 程序报如下错误&#xff1a; 解决步骤&#xff1a; sql> alter system set processes600 scopespfile; sql> shutdown immediate; sql> startup

nginx wsgi django 建站配置最终版

服务器配置环境centos7 python3: 见web标签中安装方法 1.安装各类基础模块 yum install gcc-c &#xff08;为centos系统增加编译功能&#xff09; yum install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel &#xff08;安装这些模块都…

主存和cache每一块相等_CPU中的Cache实现原理

本文翻译自&#xff1a;http://duartes.org/gustavo/blog/微信公众号&#xff1a;技术原理君 本文简要的展示了现代Intel处理器的CPU cache是如何组织的。有关cache的讨论往往缺乏具体的实例&#xff0c;使得一些简单的概念变得扑朔迷离。也许是我可爱的小脑瓜有点迟钝吧&#…

玩转oracle 11g(21):修改为静态监听

4. listener修改为静态监听 增加红色部分 SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME d:\oracle\product\10.2.0\db_1) (PROGRAM extproc) ) (SID_DESC (GLOBAL_DBNAME docare) (ORACLE_H…

Python+Selenium练习篇之2-利用ID定位元素

在前面一篇文章&#xff0c;我们介绍了如何摘取页面字段&#xff0c;通过正则进行匹配符合要求的字段。如果感觉有点困难&#xff0c;不能立马理解&#xff0c;没有关系。把字符串摘取放到第一篇&#xff0c;是因为自动化测试脚本&#xff0c;经常要利用字符串操作&#xff0c;…

玩转oracle 11g(22):ora-01691和修改密码过期时间

5. 增加新的数据文件 报&#xff1a;ORA -01691错误 解决描述&#xff1a; 在对应表空间增加新的数据文件 1. select * from dba_data_files ; 查询出表空间的数据文件路径 2.通过语句增加&#xff1a;举例&#xff1a;表空间TSP_MEDSURGERY alter tablespace TSP_MEDSURGER…

华为云上可订阅F5_F5亮相华为云计算大会 解读云应用交付

全球领先的应用交付网络厂商F5 Networks, Inc.(NASDAQ: FFIV)在下周于上海召开的2012华为云计算大会上向用户呈现其面向云计算的应用交付解决方案。在本次活动中&#xff0c;F5将重点为用户展示与华为在云计算方面的合作&#xff0c;F5与华为的联合解决方案如何帮助企业部署云架…

1. 栈和队列的数组实现

栈和队列的比较 栈和队列都属于线性表&#xff0c;且在其上进行Insert和Delete操作所插入和移除的元素是预先设定的。在栈中&#xff0c;在一端插入&#xff0c;在同一端删除&#xff0c;位于该端点的元素称为栈顶元素&#xff1b;在队列中&#xff0c;在一端插入&#xff0c;在…

玩转oracle 11g(23):区分大小写和字符集不同

7. 11g默认开始密码区分大小写 可以通过把参数设置为 SEC_CASE_SENSITIVE_LOGON FALSE 屏蔽 alter system set SEC_CASE_SENSITIVE_LOGON FALSE scopeboth; 8. 字符集不同 Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character…