USTC机试—根据文件中父节点和左右子节点的关系先建立一棵树然后层序遍历输出奇数层的结点序列(加强版层序遍历,字符串处理问题比较艰难)

代码如下:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值