目录
C++不同的二叉搜索树
一、题目要求
1、编程实现
2、输入输出
二、算法分析
三、程序编写
四、运行结果
五、考点分析
六、推荐资料
C++不同的二叉搜索树
一、题目要求
1、编程实现
给定一个整数n,求以1、2、3、......、n为节点组成的二叉搜索树有多少种
2、输入输出
输入描述:输入一个正整数n
输出描述:只有一行,一个整数,即能够组成的不同的二叉搜索树有多少种
输入样例:
3
输出样例:
5
二、算法分析
- 从给定题目的初步分析可以看出,首先小朋友们要了解什么是二叉搜索树
- 二叉搜索树:Binary Search Tree,BST,是一种二叉树的特殊形式,其中每个节点的值都大于其左子树的所有节点的值,且小于其右子树的所有节点的值。
- 二叉搜索树具有以下性质:左子树中所有节点的值都小于根节点的值。右子树中所有节点的值都大于根节点的值。左子树和右子树都是二叉搜索树。
- 从上面分析可以得到,n=1 有一棵,n=2 有两棵,n=3 有五棵
- 而从上图中可以看到,当n等于3的时候,对应的结果是由以1为节点的2棵,加上以2为节点的1棵,加上以3为节点的两棵
- 而以1为根节点的数量=左子树有0个节点的搜索树数量*右子树有2个节点的搜索树数量
- 以2为根节点的数量=左子树有1个节点的搜索树数量*右子树有1个节点的搜索树数量
- 以3为根节点的数量=左子树有2个节点的搜索树数量*右子树有0个节点的搜索树数量
- 即:dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0]
- 可以用之前学的动态规划来进行求解
- dp[i] 指的就是i个节点对应的不同的二叉搜索树的数量
- dp[0]也就是表示0个节点,也就是空二叉树对应的搜索树的数量为1,空二叉树也是一棵二叉树
- 对应的状态转移方程就是:dp[i] += dp[j-1] * dp[i-j],也就是1到i个节点之间每个以j为根节点的二叉搜索树数量之和,而每个以j为根节点的二叉搜索树的数量等于左子树有j-1个节点的搜索树数量乘以右子树有i-j个节点的搜索树数量
- 对应的遍历顺序就是从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
5
5
42
五、考点分析
难度级别:难,这题相对而言难在题目分析,具体主要考查如下:
- 分析题目,找到解题思路
- 充分掌握变量和数组的定义和使用
- 学会动态规划算法的原理和使用
- 确定动态数组的定义和含义
- 分析出动态规划算法的状态转移方程以及遍历顺序
- 学会输入流对象cin的使用,从键盘读入相应的数据
- 学会for循环的使用,在确定循环次数的时候推荐使用学会
- 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
- 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
- 充分掌握变量定义和使用,循环语句和动态规划算法的应用
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!
六、推荐资料
- 所有考级比赛学习相关资料合集【推荐收藏】