noip第21课作业
1. 遍历二叉树
【问题描述】
以先序的方式建立一棵二叉树,空结点用‘#’号表示,例如:abd###ce##f##,将建立一棵如下的二叉树:
输出其中序序列和后序序列,其中总结点个数不超过100。
输入:仅一行,输入一串字符串,该字符串必须能构成一棵二叉树;
输出:两行,第一行为中序序列,第二行为后序序列。
【样例输入】
abd###ce##f##
【样例输出】
dbaecf
dbefca
#include<iostream>
using namespace std;
struct node{
char value;
int left,right;//左右孩子子树
}data[];
char ch;
int cnt,root;
//建立一棵二叉树 abd###ce##f##
int buildTree(int bt){
cin >> ch;
if(ch == '#'){
bt = ;
}
else{
bt = ++cnt;
data[bt].value = ch;
data[bt].left = data[bt].right = ;
data[bt].left = buildTree(bt);
data[bt].right = buildTree(bt);
}
return bt;
}
//中序序列
void MidTree(int bt){
if(bt){
MidTree(data[bt].left);
cout << data[bt].value;
MidTree(data[bt].right);
}
}
//后序序列
void LastTree(int bt){
if(bt){
LastTree(data[bt].left);
LastTree(data[bt].right);
cout << data[bt].value;
}
}
int main()
{
root = ;
cnt = ;
root = buildTree();
MidTree(root);
cout << endl;
LastTree(root);
return ;
}
2. 计算二叉树的结点个数
【问题描述】
以先序的方式建立一棵二叉树,空结点用‘#’号表示,例如:abd###ce##f##,将建立一棵如下的二叉树:
输出其总结点的个数,其中总结点个数不超过100。
输入:仅一行,输入一串字符串,该字符串必须能构成一棵二叉树;
输出:仅一行,为该二叉树的结点个数。
【样例输入】
abd###ce##f##
【样例输出】
6
#include<iostream>
using namespace std;
struct node{
char value;
int left,right;//左右孩子子树
}data[];
char ch;
int cnt,root;
//建立一棵二叉树 abd###ce##f##
int buildTree(int bt){
cin >> ch;
if(ch == '#'){
bt = ;
}
else{
bt = ++cnt;
data[bt].value = ch;
data[bt].left = data[bt].right = ;
data[bt].left = buildTree(bt);
data[bt].right = buildTree(bt);
}
return bt;
}
//计算结点数
int Node(int bt){
if(bt){
if(data[bt].left == && data[bt].right == ) return ;
else return Node(data[bt].left)+Node(data[bt].right) + ;
}
else return ;
}
int main()
{
root = ;
cnt = ;
root = buildTree();
cout << Node(root) << endl;
return ;
}
3. 计算二叉树的叶子结点个数
【问题描述】
以先序的方式建立一棵二叉树,空结点用‘#’号表示,例如:abd###ce##f##,将建立一棵如下的二叉树:
输出其叶子结点的个数,其中总结点个数不超过100。
输入:仅一行,输入一串字符串,该字符串必须能构成一棵二叉树;
输出:仅一行,为该二叉树的叶子结点的个数。
【样例输入】
abd###ce##f##
【样例输出】
3
#include<iostream>
using namespace std;
struct node{
char value;
int left,right;//左右孩子子树
}data[];
char ch;
int cnt,root;
//建立一棵二叉树 abd###ce##f##
int buildTree(int bt){
cin >> ch;
if(ch == '#'){
bt = ;
}
else{
bt = ++cnt;
data[bt].value = ch;
data[bt].left = data[bt].right = ;
data[bt].left = buildTree(bt);
data[bt].right = buildTree(bt);
}
return bt;
}
//计算叶子数
int Leaf(int bt){
if(bt){
if(data[bt].left == && data[bt].right == ){
return ;
}
else return Leaf(data[bt].left)+Leaf(data[bt].right);
}
else return ;
}
int main()
{
root = ;
cnt = ;
root = buildTree();
cout << Leaf(root) << endl;
return ;
}
4. 解密犯罪团伙
【问题描述】
快过年了,犯罪分子们也开始为年终奖“奋斗”了,小明的家乡出现了多次抢劫事件。由于强盗人数过于庞大,作案频繁,警方想查清楚到底有几个犯罪团伙实在是太不容易了,不过呢,经过很多天的努力,警察叔叔还是搜集到了一些线索,需要聪明的我们编写程序帮助警察叔叔分析一下有多少个独立的犯罪团伙?
输入格式:输入第一行为n,m,n表示强盗的人数,m表示警方搜集到的m条线索。接下来m行每一行有两个数a,b,表示强盗a和强盗b是通过。
数据范围说明:(1≤n≤20000),(1≤m≤1000000),1≤a,b≤n。
【输入样例】
10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4
【输出样例】
3
#include<iostream>
using namespace std;
int f[] = {},n,m,k,sum = ;
//数组初始化,数组里存的是自己的下标
void init(){
for(int i = ; i <= n; i++){
f[i] = i;
}
}
//查找过程
int getf(int v){
if(f[v] == v){
return v;
}
else{
f[v] = getf(f[v]);
return f[v];
}
}
//合并的过程
void merge(int x, int y){
int t1,t2;
t1 = getf(x);
t2 = getf(y);
if(t1 != t2){
f[t2] = t1;
}
}
int main()
{
int i,x,y;
cin >> n >> m;
init();
for(i = ; i <= m; i++){
cin >> x >> y;
merge(x,y);
}
for(i = ; i <= n; i++){
if(f[i] == i) sum++;
}
cout << sum << endl;
return ;
}
1. 小球下落
【问题描述】
许多的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary Tree,满二叉树),每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。决定球运动方向的是每个节点的布尔值。最初,所有的节点都是false,当访问到一个节点时,如果这个节点时false,则这个球把它变成true,然后从左子树走,继续他的旅程。如果节点时true,则球也会改变它为false,而接下来从右子树走。满二叉树的标记方法如下图:
因为所有的节点最初为false,所以第一个球将会访问节点1,节点2和节点4,转变节点的布尔值后在节点8停止。第二个球将会访问节点1,3,6,在节点12停止。明显地,第三个球在它停止之前,会访问节点1,2,5,在节点10停止。现在你的任务是,给定FBT的深度D,和I,表示第I个小球下落,你可以假定I不超过给定的FBT的叶子树,写一个程序求小球停止时的叶子序号。
输入:仅一行,包含两个用空格隔开的整数D和I(2≤D≤20,I≤I≤524288)。
输出:对应输出第1个小球下落停止时的叶子序号。
【样例输入】4 2
【样例输出】12
#include<iostream>
using namespace std;
bool tree[*];
int main()
{
int d,k,i,j,p;
cin >> d >> k;
for(i = ; i <= k; i++){ //枚举每一个球的下落情况
p = ;
for(j = ; j < d; j++){
if(tree[p] == false){ //结点的值为0
tree[p] = true;
p *= ; //向左走
}
else{ //结点的值为 1
tree[p] = false;
p = p*+; //向右走
}
}
}
cout << p << endl;
return ;
}
noip第21课作业的更多相关文章
- noip第34课作业
1. 信息加密 [问题描述] 在传递信息的过程中,为了加密,有时需要按一定规则将文本转换成密文发送出去.有一种加密规则是这样的:1. 对于字母字符,将其转换成其后的第3个字母.例如:A→D,a→ ...
- noip第27课作业
1. 繁忙的都市 [问题描述] 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个 ...
- noip第5课作业
1. 计算税收 [问题描述] 对某产品征收税金,在产值1万元以上收税5%:在1万元以下但在5000元或者以上的征收税3%:在5000元以下但在1000元或以上征收税2%:1000元以下的免收税 ...
- noip第4课作业
1. 计算邮资 [问题描述] 根据邮件的重量和用户是否选择加急计算邮费.计算规则:重量在1000克以内 (包含1000克),基本费8元.超过1000克的部分,每500克加收超重费4元,不足500 ...
- noip第9课作业
1. 打印乘法表 [问题描述] 用for循环实现输出1至9的乘法表 [样例输出] 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4 ...
- noip第21课资料
- noip第33课作业
1. 排座椅 [问题描述] 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同 ...
- noip第29课作业
1. 钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...
- noip第28课作业
分段数列 [问题描述] 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入格式: 输入第1行包含两个正整 ...
随机推荐
- jquery 进阶 bootstrap
. 样式操作 . 操作class . 操作CSS属性的 .css("color") .css("color", "green") .css( ...
- maven项目打包发布到私有仓库
在项目开发中通常会引用其他的jar,怎样把自己的项目做为一个jar包的形式发布到私服仓库中,主要有以下三个步骤 (怎样配置maven私服仓库,就不再这里说明了,可以参考以前的文章)1.在maven的s ...
- js分割数字
var str = "123"; var b = String(str).split(''); 打印b[0].b[1].b[2]看效果...
- Ubuntu安装bcmath扩展
sudo apt-get install php-bcmath
- insert执行错误,怎么样获取具体的错误原因
1.开启debug 2.去runtime里面去找最后执行的SQL
- laravel目录结构
- Spring ApplicationContext(十)finishRefresh
ApplicationContext(十)finishRefresh Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 经过 ...
- Mysql 注入load_file常用路径
WINDOWS下: c:/boot.ini //查看系统版本 c:/windows/php.ini //php配置信息 c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的M ...
- mysql 设置用户并授权
一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...
- 2017年多校get点
杨辉三角形变形??? lucas定理