问题:
输出树的层次遍历的奇数层的所有结点。(未必是二叉树)
输入:
从input.txt文件读入数据。
每行的第一个字母表示双亲结点,每行第一个以后的字母表示该双亲结点的孩子结点。第一行的第一个结点表示根结点。如输入格式中第一行A B C,A为根结点并且为双亲结点,B C为其孩子结点。A B C间有空格。
输出:
结果输出到output.txt中。
输出奇数层的所有结点。每层输出一行。
如:
input.txt中的输入格式:
A B C
B E
C F G
output.txt的输出格式:
第1层结点:A
第3层结点:E,F,G
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;int level[100]; //标记每个结点所在层
char str[20]; //存储读入的一行结点
int node[20][50]; //以数字的形式存储每行的结点
int q_output[100]; //按顺序保存队列输出的结点queue<int> Q; //定义一个队列用于层次遍历;
vector<int> edge[100]; //定义邻接表存储树的结点int main(){
int len;
int i,j,k;
int line;
FILE *fp1,*fp2;
fp1=fopen("input.txt","r");
fp2=fopen("output.txt","w");if(fp1==NULL||fp2==NULL){
printf("cannot open file\n");
exit(0);
}for(i=0;i<20;++i)
for(j=0;j<50;++j)
node[i][j]=0;
for(i=0;i<100;++i){
edge[i].clear();
q_output[i]=0;
}line=0;
while(fgets(str,100,fp1)!=NULL){ //从input文件读入一行字符串
k=0;
len=strlen(str);
for(i=0;i<len;++i){
if(str[i]>='A'&&str[i]<='Z')
node[line][k++]=str[i]-'A';
node[line][k]=-1; //以-1标记每行的结尾
}
line++;
}
//用node[i][j]数组保存输入的结点,i代表行从0开始,j代表每行第几个结点,j=0表示双亲结点
level[node[0][0]]=1; //第一行第一个结点为根结点,在第一层
for(i=0;i<line;++i)
for(j=0;node[i][j]!=-1;++j){
if(j!=0){
edge[node[i][0]].push_back(node[i][j]);
level[node[i][j]]=level[node[i][0]]+1; //标记每个结点所在的层
}
}
//用邻接表保存树
Q.push(node[0][0]); //根结点入队
int size=0;
while(!Q.empty()){
int front=Q.front(); //取队首结点
q_output[size++]=front; //层次遍历的顺序将结点保存在数组q_output[]中
Q.pop();
for(i=0;i<edge[front].size();++i){
Q.push(edge[front][i]); //将front的孩子结点入队
}
}
i=0;
int flag,size_2;
while(i<size){
flag=0;
size_2=0;
while(level[q_output[i]]%2==1&&i<size){
flag=1;
k=level[q_output[i]];
str[size_2++]=(q_output[i]+'A');
++i;
}
if(flag==1){
--i;
str[size_2]='\0';
fprintf(fp2,"第%d层:",k);
for(j=0;j<size_2;++j){
if(j==0)
fprintf(fp2,"%c",str[j]);
else
fprintf(fp2,",%c",str[j]);
}
char ch='\n';
fprintf(fp2,"%c",ch);
}
++i;
}
fclose(fp1);
fclose(fp2);
return 0;
}