算法学习011-不同的二叉查找树/搜索树 c++动态规划算法实现 中小学算法思维学习 信奥算法解析

目录

C++不同的二叉查找树

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、运行结果

五、考点分析

六、推荐资料


C++不同的二叉查找树

一、题目要求

1、编程实现

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

现给定一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。

注:节点个数数n在1到19之间

2、输入输出

输入描述:输入一个正整数n(1<=n<=40)

输出描述:只有一行,一个整数,即多少种不同的二叉搜索树

输入样例:

3

输出样例:

5

二、算法分析

  1. 从给定题目的初步分析可以看出,这是算法中比较典型的不同二叉搜索树
  2. 根据二叉搜索的定义可以得出,左子树一定比节点小,右子树比节点大
  3. 接下来具体分析:
  4. 当节点为0的时候,也就是节点为空,这个是空二叉树也是一棵二叉树
  5. 当节点为1的时候,就是只有一个节点1,为一棵二叉树
  6. 当节点为2的时候,根据定义可以有:节点为1右子树为2的二叉树和节点为2左子树为1的二叉树,共2棵二叉树
  7. 当节点为3的时候,根据上图可以看到由:节点为1的两棵和节点为2的一棵和节点为3的两棵相加而来,共有5棵
  8. 而通过观察节点为3的二叉树,当节点为1的时候,发现左子树是为0(一棵),右子树为2和3(两棵)即:1*2=2
  9. 再次分析节点为3的二叉树,当节点为2的时候,左右子树都是为1(一棵),即:1*1=1
  10. 继续分析节点为3的二叉树,当节点为3的时候,发现左子树是为1和2(两棵),右子树为0(一棵)即:2*1=2
  11. 所以可以采用动态规划的方式来进行实现
  12. 设置动态数组dp[i],i表示爬上第几个节点;所以对应的dp[i]就是爬上第i个节点对应的不同的二叉搜索树
  13. 而要求第i个节点对应的不同二叉搜索树需要从1遍历到第i个节点,将每个节点对应的左子树对应的不同二叉树乘以右子树对应的不同二叉树然后累加的来
  14. 所以可以得出对应的动态数组dp[i]的状态转移方为:dp[i]+=dp[j-1]*dp[i-j]
  15. 同时遍历顺序为从小到大,外层从0到n,内层从1到i
  16. 而根据题目分析可以得到dp[0]=dp[1]=1

三、程序编写

//程序中的dp可以使用动态数组vector进行实现更好
#include<bits/stdc++.h>
using namespace std;
int dp[20];
int getTrees(int n)
{
	dp[0] = dp[1] = 1;
	for(int i=2;i<=n;i++)
		for(int j=1;j<=i;j++)
			//第i个节点对应的不同二叉搜索由对应不同左子树乘以不同右子树而来
			dp[i] += dp[j-1] * dp[i-j];
	return dp[n];
}
int main()
{
	int n;
	cin >> n;
	cout << getTrees(n);
	return 0;
}

 本文作者:小兔子编程 作者首页:小兔子编程-CSDN博客

四、运行结果

3
5

5
42

五、考点分析

难度级别:中等,这题相对而言有一定难度,具体主要考查如下:

  1. 分析题目,找到解题思路
  2. 了解什么是二叉搜索树,二叉搜索树的定义
  3. 充分掌握变量和数组的定义和使用
  4. 学会动态规划算法的原理和使用
  5. 确定动态数组的定义和含义
  6. 分析出动态规划算法的状态转移方程以及遍历顺序
  7. 学会输入流对象cin的使用,从键盘读入相应的数据
  8. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  9. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  10. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  11. 充分掌握变量定义和使用、分支语句、循环语句和动态规划算法的应用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

六、推荐资料

  • 所有考级比赛学习相关资料合集【推荐收藏】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI图书推荐:ChatGPT全面指南—用AI帮你更健康、更富有、更智慧

你是否在努力改善你的健康&#xff1f; 你是否长期遭受财务困难&#xff1f; 你想丰富你的思想、身体和灵魂吗&#xff1f; 如果是这样&#xff0c;那么这本书就是为你准备的。 《ChatGPT全面指南—用AI帮你更健康、更富有、更智慧》&#xff08;CHATGPT Chronicles AQuick…

Mybatis-Plus常用的增删改查坑

添加依赖 <!--实体类上加上Data注解就不用写get&#xff0c;set&#xff0c;toString&#xff0c;equals等方法了--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional…

Three.js基础练习——渲染一个立方体

1.学习内容参考了 three.js入门教程--零基础也能学会_threejs菜鸟教程-CSDN博客 本章内容包含渲染立方体&#xff0c;并配合ui工具食用~ 2.效果图 import * as THREE from three import * as dat from dat.gui import { OrbitControls } from three/addons/controls/OrbitC…

ETL中如何执行Python脚本

Python的解读 Python 是一种高级、通用的编程语言&#xff0c;由荷兰程序员吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1990年代初设计并发布。Python的设计哲学强调代码的可读性和简洁性&#xff0c;它的语法清晰且表达力强&#xff0c;使得开发者能够以更少的代…

中国各地级市的海拔标准差数据集

01、数据简介 海拔标准差是指对某个地点的海拔进行测量后&#xff0c;所得结果与平均海拔之间的差异。它反映了测量结果的离散程度&#xff0c;即海拔数据的可靠性。如果标准差较小&#xff0c;说明测量结果的可靠性较高&#xff1b;如果标准差较大&#xff0c;则说明测量结果…

《解锁高效合同管理系统:优化业务流程,提升管理效率》

随着企业规模的扩大和业务复杂性的增加&#xff0c;合同管理变得愈发重要。合同是企业与客户、供应商、合作伙伴之间的法律约束和商业承诺&#xff0c;而有效的合同管理系统则成为企业提高运营效率、降低风险的关键工具。本文将探讨合同管理系统的重要性以及如何利用合同管理系…

Electron 报错:WinState is not a constructor

文章目录 问题分析 问题 在使用 electron-win-state 库时报错如下 代码如下&#xff1a; const WinState require(electron-win-state) const winState new WinState({ defaultWidth: 800,defaultHeight: 600,// other winState options, see below })const browserWindow…

工作中使用Optional处理空指针异常

工作中使用Optional处理空指针异常 实体类以前对空指针的判断Optional处理空指针测试结果 实体类 package po;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;Data AllArgsConstructor NoArgsConstruct…

【Vue2】关于response返回数据的错误小记

关于Vue2中response返回数据的一个错误小记 如图&#xff0c;在这里返回的时候&#xff0c;后端是通过List< String >返回的&#xff0c;response接收到的实际上是一个Array数组&#xff0c;但是赋值给searchedTaskList的时候&#xff0c;需要在.then包括的范围里面赋值给…

a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题

a-auto-complete 请求后端数据做模糊查询&#xff0c;解决下拉框选择选不上&#xff0c;不回显的问题 记录一个a-auto-complete卡bug卡了两天&#xff0c;找不到哪里的问题下拉框选择选不上&#xff0c;不回显&#xff0c;最后终于解决了。 我还对下拉框显示的内容做了小调整。…

使用Vue调用ColaAI Plus大模型,实现聊天(简陋版)

首先去百度文心注册申请自己的api 官网地址&#xff1a;LuckyCola 注册点开个人中心 查看这个文档自己申请一个ColaAI Plus定制增强大模型API | LuckyColahttps://luckycola.com.cn/public/docs/shares/api/colaAi.html来到vue的页面 写个样式 <template><Header …

知识库文档系统源码部署/搭建/上线/运营/售后/更新

一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&#xff0c;更好地成就组织和个人。为部门、团队或项目搭建知识库…

Ubuntu/Linux 安装Docker + PyTorch

文章目录 1. 提前准备2. 安装Docker2.1. 卸载冲突软件&#xff08;非必要&#xff09;2.2. 在Ubuntu系统上添加Docker的官方GPG密钥2.3. 将Docker的仓库添加到Ubuntu系统的APT源列表中2.4. 安装最新Docker2.5. 检查 3. 安装Nvidia Container Toolkit3.1. 在Ubuntu系统上添加官方…

回炉重造java----双列集合(HashMap,TreeMap)

体系结构 ①基本操作: ②遍历方式: 第一种: 键找值&#xff0c;通过map.keySet()获取Map的键集合&#xff0c;通过键去匹配Map中的值 Set<String> strings map.keySet();for (String string : strings) {System.out.println(map.get(string));} 第二种: 键值对&…

编程式导航

目录 一、问题引入 二、基本跳转 1.path路径跳转&#xff08;简易方便&#xff09; 2.name命名路由跳转&#xff08;适合path路径长的场景&#xff09; 三、路由传参 1.path路径跳转传参 &#xff08;1&#xff09;query传参 &#xff08;2&#xff09;动态路由传参 2.…

【C++】CentOS环境搭建-安装log4cplus日志组件包及报错解决方案

log4cplus简介 log4cplus是C编写的开源的日志系统&#xff0c;前身是java编写的log4j系统&#xff0c;受Apache Software License保护&#xff0c;作者是Tad E. Smith。 log4cplus具有线程安全、灵活、以及多粒度控制的特点&#xff0c;通过将日志划分优先级使其可以面向程序…

Linux 进程间通信 System V系列: 共享内存,信号量,简单介绍消息队列

进程间通信 System V系列: 共享内存,初识信号量 一.共享内存1.引入2.原理3.系统调用接口1.shmget2.shmat和shmdt3.shmctl 4.边写代码边了解共享内存的特性1.ftok形成key,shmget创建与获取共享内存2.shm相关指令3.shmat和shmdt挂接和取消挂接4.shmctl获取共享内存信息,释放共享内…

如何访问远程MySQL数据库服务器?

访问远程MySQL数据库服务器是一项常见的任务&#xff0c;它允许我们在不同的地点通过网络连接到MySQL服务器&#xff0c;并进行数据库管理和数据处理操作。我们将重点介绍一种名为【天联】的组网技术&#xff0c;该技术提供了一系列优势&#xff0c;使远程访问MySQL数据库服务器…

<网络安全>《83 微课堂<国家数据要素总体框架>》

1 总体框架 国家数据要素化总体框架由“六横两纵”共八个关键环节构成。 2 国家数据基础设施&#xff08;NDI&#xff09; 最底部第一层是国家数据基础设施&#xff08;NDI&#xff09;。国家数据基础设施&#xff08;NDI&#xff09;是经济社会进入数据要素化发展新阶段后新…

Github2024-05-10开日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-05-10统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目4JavaScript项目1Lua项目1C项目1Rust项目1Dart项目1 RustDesk: 用Rust编写的开源远…