层次遍历二叉树并计算每层节点个数以及各节点所在层数以及宽度算法

#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);//树的宽度 
} 

输入:

输出:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值