C语言编程题,关于树的层次遍历

问题:
输出树的层次遍历的奇数层的所有结点。(未必是二叉树)
输入:

从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;

发布了5 篇原创文章 · 获赞 3 · 访问量 1518

猜你喜欢

转载自blog.csdn.net/include_xy/article/details/88047014