二叉树的层次遍历

发布时间 2023-08-14 10:27:29作者: 正确选项
#include <stdio.h>
#include <stdlib.h>

#define MaxSize 100

typedef struct TreeNode{
	int data;
	struct TreeNode *lchild,*rchild;
}TreeNode,*Tree;

typedef struct{
	TreeNode* data[MaxSize];
	int front;
	int rear;
}Queue;

void InitQueue(Queue &Q)
{
	Q.front=Q.rear=0;
}

bool isEmpty(Queue Q)
{
	if(Q.front==Q.rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool isFull(Queue Q)
{
	if((Q.rear+1)%MaxSize==Q.front)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool EnQueue(Queue &Q,TreeNode* p)
{
	if(isFull(Q))
	{
		return false;
	}
	Q.data[Q.rear]=p;
	Q.rear=(Q.rear+1)%MaxSize;
	return true;
}

bool DeQueue(Queue &Q,TreeNode* &p)
{
	if(isEmpty(Q))
	{
		return false;
	} 
	p=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;
	return true;
}

//先序创建二叉树
void CreateTree(Tree &T)
{
	int x;
	scanf("%d",&x);
	if(x==-1)
	{
		T=NULL;
		return;
	}
	else
	{
		T=(Tree)malloc(sizeof(TreeNode));
		T->data=x;
		printf("输入%d的左结点:",x);
		CreateTree(T->lchild);
		printf("输入%d的右结点:",x);
		CreateTree(T->rchild);
	}
}

//层次遍历(利用队列) 
void LevelOrder(Tree T)
{
	Queue Q;
	InitQueue(Q);
	TreeNode *p=T;
	EnQueue(Q,p);
	while(!isEmpty(Q))
	{
		DeQueue(Q,p);
		printf("%d  ",p->data);
		if(p->lchild!=NULL)
		{
			EnQueue(Q,p->lchild);
		}
		if(p->rchild!=NULL)
		{
			EnQueue(Q,p->rchild);
		}
	}	
} 

int main()
{
	Tree T;
	CreateTree(T);
	LevelOrder(T); 
	return 0;	
}