【问题描述】
给定一颗二叉树,要求从下至上按层遍历二叉树,每层的访问顺序是从左到右,每一层单独输出一行。
【输入形式】
广义表表示的二叉树,结点元素类型为整型,且都大于0,例如:1( 2( 3 ( 4, 5 ) ), 6( 7, 8( 9, 10 ) ) )
【输出形式】
从下至上,打印每一层的结点元素值,元素间以空格隔开。每层的访问顺序是从左到右,每一层单独输出一行。
【样例输入】
1(2(3(4,5)),6(7,8(9,10))),字符串内没有空格
【样例输出】
4 5 9 10
3 7 8
2 6
1
【样例说明】
【评分标准】
本题目主要考察两个知识点:
1.创建二叉树存储结构
2.按层次遍历二叉树的算法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct BiTNode
{
int data;
int cs;//记录层数
struct BiTNode *lchild ,*rchild;
}BiTNode,*BiTree;
typedef struct
{
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
typedef struct QNode
{
BiTree data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(-1);
Q.front->next=NULL;
return 1;
}
int EnQueue(LinkQueue&Q, BiTree e)
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(-2);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
int DeQueue(LinkQueue &Q,BiTree &e)
{
if(Q.front==Q.rear) return -1;
QueuePtr p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return 1;
}
int InitStack(SqStack &S)
{
S.base=( BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree));
if(!S.base) exit(-1);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int Push(SqStack &S,BiTree e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(BiTree*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
if(!S.base) exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack&S,BiTree &e)
{
if(S.top==S.base)
return -1;
e=*--S.top;
return 1;
}
int GetTop(SqStack S,BiTree &e)
{
if(S.top==S.base) return 0;
e=*(S.top-1);
return 1;
}
void CreatBiNode(BiTree &T,int integer,int cs)
{
T=(BiTNode *)malloc(sizeof(BiTNode));
if(T==NULL) exit(-1);
T->data=integer;
T->cs=cs;
T->rchild=NULL;
T->lchild=NULL;
}
//字符是1,数字是0
int ShuOrFu(char c)
{
if((c=='(')||(c==')')||(c==','))
return 1;
else
return 0;
}
void CreatBiTree(BiTree &T,char *s)
{
int integer,i=1,cs=1;
SqStack S; //用栈来记录
InitStack(S);//根节点
integer=s[0]-'0';
CreatBiNode(T,integer,cs);
BiTree p=T,q=NULL; //辅助
char c;
for(int i=1;i<strlen(s)-1;i++)
{
if((ShuOrFu(s[i])==0)&&(ShuOrFu(s[i+1])==1))
integer=s[i]-'0';
if(ShuOrFu(s[i])==1)
{ c=s[i];
if(c=='('||c==',')
continue;
}
if((ShuOrFu(s[i])==0)&&(ShuOrFu(s[i+1])==0))
{ integer=(s[i]-'0')*10+(s[i+1]-'0');
i=i+1;
}
if(c=='(')
{
cs++;
CreatBiNode(p->lchild,integer,cs);
GetTop(S,q);
if(q!=p)
Push(S,p);
p=p->lchild;
}
else if(c==')')
{
Pop(S,p);
cs--;
}
else if(c==',')
{
Pop(S,p);
CreatBiNode(p->rchild,integer,cs);
Push(S,p->rchild);
p=p->rchild;
}
else break;
}
}
void ACTraverse(BiTree T)
{
LinkQueue Q;
InitQueue(Q);
BiTree a[100];
EnQueue(Q,T);
int i=0;
while(Q.front!=Q.rear)
{
//printf("%d ",Q.front->data->data);
if(Q.front->next->data->rchild!=NULL)
EnQueue(Q,Q.front->next->data->rchild);
if(Q.front->next->data->lchild!=NULL)
EnQueue(Q,Q.front->next->data->lchild);
DeQueue(Q,a[i]);
i++;
}
int k=a[i-1]->cs;
for(int j=i-1;j>=0;j--)
{
if(k!=a[j]->cs)
printf("\n");
printf("%d ",a[j]->data);
k=a[j]->cs;
}
}
void PreOrder(BiTree T)
{
if(T)
{
printf("%d ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
int main()
{
BiTree T=NULL;
char s[100];
gets(s);
CreatBiTree(T,s);
//PreOrder(T);
ACTraverse(T);
return 0;
}