当前位置: 首页 > news >正文

算法学习017 不同的二叉搜索树 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析

目录

C++不同的二叉搜索树

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、运行结果

五、考点分析

六、推荐资料


C++不同的二叉搜索树

一、题目要求

1、编程实现

给定一个整数n,求以1、2、3、......、n为节点组成的二叉搜索树有多少种

2、输入输出

输入描述:输入一个正整数n

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

输入样例:

3

输出样例:

5

二、算法分析

  1. 从给定题目的初步分析可以看出,首先小朋友们要了解什么是二叉搜索树
  2. 二叉搜索树:Binary Search Tree,BST,是一种二叉树的特殊形式,其中每个节点的值都大于其左子树的所有节点的值,且小于其右子树的所有节点的值。
  3. 二叉搜索树具有以下性质:左子树中所有节点的值都小于根节点的值。右子树中所有节点的值都大于根节点的值。左子树和右子树都是二叉搜索树。
  4. 从上面分析可以得到,n=1 有一棵,n=2 有两棵,n=3 有五棵
  5. 而从上图中可以看到,当n等于3的时候,对应的结果是由以1为节点的2棵,加上以2为节点的1棵,加上以3为节点的两棵
  6. 而以1为根节点的数量=左子树有0个节点的搜索树数量*右子树有2个节点的搜索树数量
  7. 以2为根节点的数量=左子树有1个节点的搜索树数量*右子树有1个节点的搜索树数量
  8. 以3为根节点的数量=左子树有2个节点的搜索树数量*右子树有0个节点的搜索树数量
  9. 即:dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0] 
  10. 可以用之前学的动态规划来进行求解
  11. dp[i] 指的就是i个节点对应的不同的二叉搜索树的数量
  12. dp[0]也就是表示0个节点,也就是空二叉树对应的搜索树的数量为1,空二叉树也是一棵二叉树
  13. 对应的状态转移方程就是:dp[i] += dp[j-1] * dp[i-j],也就是1到i个节点之间每个以j为根节点的二叉搜索树数量之和,而每个以j为根节点的二叉搜索树的数量等于左子树有j-1个节点的搜索树数量乘以右子树有i-j个节点的搜索树数量
  14. 对应的遍历顺序就是从1一直到n,从前往后即可

三、程序编写

#include<bits/stdc++.h>
using namespace std;
int dp[20];
int getBst(int n)
{dp[0] = 1;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)dp[i] += dp[j-1] * dp[i-j];return dp[n];	
}int main()
{int n;cin>>n;cout << getBst(n);return 0;
}

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

四、运行结果

3
55
42

五、考点分析

难度级别:难,这题相对而言难在题目分析,具体主要考查如下:

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

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

六、推荐资料

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

http://www.mrgr.cn/news/1411.html

相关文章:

  • 数字(智)化采购系统优点_亮点_应用场景
  • 数学中常用的解题方法
  • Springboot功能模块之EasyExcel
  • EmguCV学习笔记 VB.Net 4.5 像素距离和连通区域
  • 机械学习—零基础学习日志(如何理解概率论2)
  • 加速网页加载,提升用户体验:HTML、JS 和 Vue 项目优化全攻略
  • CSS的:first-of-type伪类:精确定位特定类型的首子元素
  • Spring源码解析(34)之Spring事务回滚流程
  • c语言基础知识学习
  • 定时执行系统及容器日志清理
  • Zookeeper详解以及常见的高可用关联组件
  • mysqlA表连接B表,并取B表中更新时间最新
  • php连接sphinx的长连接事宜以及sphinx的排除查询以及关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询
  • Qt —— 创建 hello world
  • HexView 刷写文件脚本处理工具-命令行介绍(四)-地址范围缩减(/AR:‘range‘)
  • Spring Boot 应用案例:打造股票价格自动通知平台
  • 【机器学习】CNN的数学基础
  • 物联网(IoT)详解
  • Apisix自定义httpcode 请求重试
  • Spring SSM框架--MVC