二叉树的层序遍历(C语言实现)

二叉树的层序遍历

这是库存,以前写的。

一、思想

要进行二叉树的层序遍历,需要借助一个辅助队列实现。首先将二叉树的根结点入队,然后出队,访问出队结点,若它有左子树,则将左子树根结点入队;若它有右子树,将右子树根结点入队。然后出队,访问出队结点…如此反复,直到队列为空。(参考王道书)

二、代码实现

#include
#include
#define MaxSize 10
 
typedef struct BNode {
	int data;	//数据域
	struct BNode* lchild;		//左孩子
	struct BNode* rchild;		//右孩子 
}*BiTree,BNode;

//循环队列的数据结构
typedef struct CirSqueue
{
	BiTree data[MaxSize]; //队列最大容量为MaxSize
	int front,rear;
}CirSqueue;
 
//初始化
void Initqueue(CirSqueue *Q)
{
	Q->front = Q->rear = 0;
}

//判断队列是否为空
int QueueEmpty(CirSqueue Q)
{
	return Q.front == Q.rear;
}

//入队
void EnQueue(CirSqueue *Q, int x)
{
	if ((Q->rear + 1) % MaxSize == Q->front)
	{
		printf("队满!\n");
		return;
	}
	Q->data[Q->rear] = x;
	Q->rear = (Q->rear + 1) % MaxSize;
}
//出队
void OutQueue(CirSqueue *Q)
{
	Q->front = (Q->front + 1) % MaxSize;
}
 
BiTree CreateBinTree()
{
	int data;
	int temp;
	BiTree T;
 
	scanf("%d", &data);		//	输入数据
	temp = getchar();			//吸收空格
 
	if (data == -1) {			//输入-1 代表此节点下子树不存数据,也就是不继续递归创建
		return NULL;
	}
	else {
		T = (BiTree)malloc(sizeof(BNode));			//		分配内存空间
		T->data = data;								//		把当前输入的数据存入当前节点指针的数据域中
 
		printf("请输入%d的左子树: ", data);
		T->lchild = CreateBinTree();					//		开始递归创建左子树
		printf("请输入%d的右子树: ", data);
		T->rchild = CreateBinTree();					//		开始到上一级节点的右边递归创建左右子树
		return T;							//		返回根节点
	}
 
}

//层序遍历需要借助队列来实现 
void levelOrder(BiTree T)
{
	CirSqueue Q;
	Initqueue(&Q);
	EnQueue(&Q,T);//根节点入队 
	
	BiTree P;
	while (!QueueEmpty(Q))
	{
		printf("%d ",Q.data[Q.front]->data);//访问队头元素 
		P = Q.data[Q.front];
		OutQueue(&Q);//出队 
		if(P->lchild!=NULL)
			EnQueue(&Q, P->lchild);//左子树不空则入队 
		if(P->rchild!=NULL)
			EnQueue(&Q, P->rchild);//右子树不空则入队 
	}
}
 
 
int main()
{
	BiTree T;
	printf("请输入第一个节点的数据:\n");
	T = CreateBinTree();			//		接受创建二叉树完成的根节点
	printf("\n层次遍历结果: \n");
	levelOrder(T);
	return 0;
}

三、测试结果

注意,保存代码时要以 .c 为后缀,而不是.cpp后缀。
二叉树的层序遍历(C语言实现)_第1张图片
二叉树的层序遍历(C语言实现)_第2张图片

你可能感兴趣的:(数据结构,C语言,c语言,数据结构,算法)