代码如下:
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define N 100
struct Node{
struct Node *lchild;
struct Node *rchild;
char c;
}Tree[N];
vector<char> m[N];
int loc=0;
struct E{
char a;//记录一个结点的左孩子信息
char b;//记录一个结点的右孩子信息
}E[N];
Node *create(){//静态分配一个结点
Tree[loc].lchild=Tree[loc].rchild=NULL;
return &Tree[loc++];
}
Node *setTree(char k,char l,char m){//按行输入递归的创建一棵树
Node *T=create();
if(k=='0')return NULL;//如果该字符是空,则返回空
else{
T->c=k;
if(l>='A'&&l<='Z')T->lchild=setTree(l,E[l-'0'].a,E[l-'0'].b);
if(m>='A'&&m<='Z')T->rchild=setTree(m,E[m-'0'].a,E[m-'0'].b);
}
return T;
}
FILE *fp1,*fp2;
/*void preOrder(Node *T){
if(T)printf("%c ",T->c);
if(T->lchild)preOrder(T->lchild);
if(T->rchild)preOrder(T->rchild);
}*/
//树建立的没问题经过检查
void levelOrder(Node *T,int level){//层序输出
if(level%2==1){
if(T)m[level].push_back(T->c);
}
if(T->lchild)levelOrder(T->lchild,level+1);
if(T->rchild)levelOrder(T->rchild,level+1);
}
int main(){
fp1=fopen("4.in","r");
fp2=fopen("4.out","w");
char s[N];
fgets(s,99,fp1);//先获取第一行数据,方便下面的函数进行传递
int len=strlen(s);
if(len==1)strcat(s,"0000");//进行标准格式化
if(len==3)strcat(s,"00");
E[s[0]-'0'].a=s[2];
E[s[0]-'0'].b=s[4];
char s1[N];
while(fgets(s1,99,fp1)!=NULL){
int len=strlen(s1);
if(len==1)strcat(s1,"0000");//进行标准格式化
if(len==3)strcat(s1,"00");
E[s1[0]-'0'].a=s1[2];
E[s1[0]-'0'].b=s1[4];
}
Node *T=setTree(s[0],s[2],s[4]);
levelOrder(T,1);
//preOrder(T);
for(int i=1;i<N;i++){
if(m[i].size()>0){
if(m[i].size()==1){
fprintf(fp2,"第%d层的结点是:",i);
fprintf(fp2,"%c",m[i][0]);
fprintf(fp2,"\n");
}
else{
fprintf(fp2,"第%d层的结点是:",i);
fprintf(fp2,"%c",m[i][0]);
for(int j=1;j<m[i].size();j++){
fprintf(fp2,",%c",m[i][j]);
}
}
}
}
return 0;
}