洛谷日记 Day 7 P1087 FBI树

5 篇文章 1 订阅
3 篇文章 0 订阅

我在这儿哟(溜~~)

个人见解

狗题!狗题!狗题!真的是坑!(好了,蒟蒻发泄完了。)

这题其实还是二叉树的后序遍历,但是蒟蒻的我拿到题是蒙的,什么FBI,要不要拨打911。唉难受。仔细看了下题,大概意思就是说给一个定长的0、1 1字符串,然后迭代切割一半,直到传长为1。其中全0的构成的树称为B树,全1构成的树称为I树,既有0又有1的树称为 F树。让输出这棵树的后序遍历结果。

我的做法其实也是蛮简单的,就是构造一个带字符型返回值的后序遍历函数,当前是什么类型的树就返回什么值,如B树就返回B,I树、F树同理。在构造到l==r的时候就判断当前是0串还是1串,0串就返回B1串就返回IF树通过在后序遍历中比较左右子树是否相等相等则输出并返回其中任意一个,不相等则直接输出并返回F

AC代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1024 + 10;//最大数据规模
char a[MAXN];
char postorder(int l,int r ) {
	if(r==l) {//左右结点位置相同,直接输出返回该结点的类型
		if(a[l]=='1') {
			cout<<"I";
			return 'I';
		} else if(a[l]=='0'){
			cout<<"B";
			return 'B';
		}
	}
	int k=(r+l)/2;//计算中值
	char c1=postorder(l,k);//遍历左子树并返回左子树的类型F B I
	char c2=postorder(k+1,r);//遍历右子树并返回右子树的类型F B I
	if(c1==c2){//c1与c2相等,直接输出并返回c1的值
		cout<<c1;
		return c1;
	}else{//c1!=c2直接输出并返回c2
		cout<<"F";
		return 'F';
	}
}
int main() {
	int n;
	cin>>n;
	cin>>a+1;
	postorder(1,pow(2,n));//pow(2,n)与2^n同理
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值