#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef char ElemType;
typedef struct SqStack{
ElemType data[MAXSIZE];
int top;
}SqStack;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTreeNode,*BiTree;
typedef struct Queue{
BiTree data[MAXSIZE];
int front,rear;
int Nodenum[MAXSIZE];//每层有多少个结点
int size;//深度
char element[MAXSIZE];//非#元素,排列方式为层次
}Queue;
void InitQueue(Queue &Q)//队列初始化
{
Q.rear=Q.front=-1;
int i=0;
for(i=0;i<MAXSIZE;i++)
Q.Nodenum[i]=0;
}
void InQueue(Queue &Q,BiTree BT)//入队
{
Q.data[++Q.rear] = BT;
}
BiTree DeQueue(Queue &Q,BiTree &BT)//出队
{
BT = Q.data[++Q.front];
}
bool IsEmpty(Queue Q)
{
if (Q.front == Q.rear)
return 1;
return 0;
}
void InitSqStack(SqStack &S)//初始化栈
{
S.top=-1;
}
void Push(SqStack &S,ElemType e)//入栈
{
S.data[++S.top] = e;
}
void Pop(SqStack &S,ElemType &e)//出栈
{
e = S.data[S.top--];
}
void print(SqStack S)//打印栈
{
int i=1;
printf("栈的内容为:");
for(i;i<=S.top;i++)
printf("%C",S.data[i]);
printf("\n");
}
void InitBiTree(BiTree BT)//构建空树
{
BT=NULL;
}
BiTree PreCreateBiTree(BiTree *BT)//先序递归建立二叉树
{
ElemType c;
scanf("%c",&c);
if(c == '#')
*BT=NULL;
else
{
*BT=(BiTree)malloc(sizeof(BiTreeNode));
(*BT)->data = c;
(*BT)->lchild = PreCreateBiTree(&((*BT)->lchild));
(*BT)->rchild = PreCreateBiTree(&((*BT)->rchild));
}
return *BT;
}
void LevelVisit(BiTree BT,Queue &Q)
{
int i=0,sum=0,k=0;
Q.Nodenum[i]=1;
InQueue(Q,BT);
while(Q.front!=Q.rear)
{
if(sum<Q.Nodenum[i])
sum++;
else
{
sum=0;
i++;
continue;
}
DeQueue(Q,BT);
Q.element[k++]=BT->data;
printf("%c ",BT->data);
if(BT->lchild!=NULL)
{
Q.Nodenum[i+1]++;
InQueue(Q,BT->lchild);
}
if(BT->rchild!=NULL)
{
Q.Nodenum[i+1]++;
InQueue(Q,BT->rchild);
}
}
Q.element[k] = '\0';
printf("\n");
}
void NodeLevel(BiTree BT,Queue &Q)//结点所在层次
{
int i=0;
printf("每层结点个数为:");
for(i=0;i<MAXSIZE;i++)
{
if(Q.Nodenum[i]==0)
break;
printf("%d ",Q.Nodenum[i]);
}
printf("\n");
Q.size = i;
int sum=0,k=0;
for(i=0;Q.element[i]!='\0';i++)
{
if(sum<Q.Nodenum[k])
sum++;
else
{
sum=0;
k++;
i--;
continue;
}
printf("%c结点位于第%d层\n",Q.element[i],k+1);
}
}
void Wide(Queue Q)
{
int i=0;
int max = Q.Nodenum[i];
for(i=0;i<Q.size;i++)
if(Q.Nodenum[i]>max)
max = Q.Nodenum[i];
printf("%d\n",max);
}
int main()
{
BiTree BT;
SqStack S;
Queue Q;
InitBiTree(BT);//构建空树
InitQueue(Q);//初始化队列
printf("请输入先序表达式:") ;
PreCreateBiTree(&BT);//先序建树
if(BT == NULL)
{
printf("树为空\n");
exit(0);
}
printf("层次遍历二叉树为:");
LevelVisit(BT,Q);//层次遍历
NodeLevel(BT,Q);//结点所在层次
printf("树的宽度为:");
Wide(Q);//树的宽度
}
输入:
输出: