我在这儿哟(溜~~)
个人见解
狗题!狗题!狗题!真的是坑!(好了,蒟蒻发泄完了。)
这题其实还是二叉树的后序遍历,但是蒟蒻的我拿到题是蒙的,什么,要不要拨打。唉难受。仔细看了下题,大概意思就是说给一个定长的 字符串,然后迭代切割一半,直到传长为1。其中全0的构成的树称为树,全1构成的树称为树,既有0又有1的树称为 树。让输出这棵树的后序遍历结果。
我的做法其实也是蛮简单的,就是构造一个带字符型返回值的后序遍历函数,当前是什么类型的树就返回什么值,如树就返回,I树、树同理。在构造到的时候就判断当前是串还是串,串就返回,串就返回。树通过在后序遍历中比较左右子树是否相等相等则输出并返回其中任意一个,不相等则直接输出并返回。
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;
}