二叉树-层序遍历

本文详细介绍了二叉链表和循环队列的数据结构及其操作实现,包括初始化、判断空队列、入队、出队、销毁队列等功能,并通过实例展示了如何使用这些数据结构构建二叉树进行层序遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<malloc.h>
#include<stdio.h>
#define  MAXSIZE  20  //最多结点个数
using namespace std;

/*二叉链表*/
typedef struct bnode{
	char data;
	struct bnode *lchild,*rchild;
}Bnode,* BTree;

/*循环队列*/
typedef BTree DataType;
typedef struct{
	DataType data[MAXSIZE];
	int front,rear;    
}SeqQueue,* PSeqQueue;

PSeqQueue Init_SeqQueue(void);				//循环队列初始化
int Empty_SeqQueue(PSeqQueue Q);			//判断队空
void In_SeqQueue(PSeqQueue Q,DataType x);	//入队
void Out_SeqQueue(PSeqQueue Q,DataType * y);//出队
void Destory_SeqQueue(PSeqQueue * Q);		//销毁队列

BTree CreateBinTree(void);//先序创建二叉树
void LevelOrder(BTree t);	//层序遍历

/*主函数*/
int main(){	
	cout<<"\n请按先序次序输入各结点的值,以#表示空树(输入时可连续输入):\n";
	BTree T=CreateBinTree();
	if(!T){
		cout<<"\n未建立树,请先建树!";
		return 0;
	}
	cout<<"\n\n层序遍历:";
	LevelOrder(T);

	return 1;
}

/*循环队列初始化*/
PSeqQueue Init_SeqQueue(void){
	PSeqQueue Q;
	Q=(PSeqQueue)malloc(sizeof(SeqQueue));
	if(Q){
		Q->front=0;
		Q->rear=0;
	}
	return Q;
}
/*判断队空*/
int Empty_SeqQueue(PSeqQueue Q){
	if(Q && Q->front==Q->rear)
		return 1;
	else 
		return 0;
}
/*入队*/
void In_SeqQueue(PSeqQueue Q,DataType x){
	if(Q->front == (Q->rear+1)%MAXSIZE){
		cout<<"队满不能入队!";
		return;
	}else{
		Q->rear=(Q->rear+1)%MAXSIZE;
		Q->data[Q->rear]=x;
	}
}
/*出队*/
void Out_SeqQueue(PSeqQueue Q,DataType * y){
	if(Empty_SeqQueue(Q)){
		cout<<"队空不能出队!";
		return;
	}else{
		Q->front=(Q->front+1)%MAXSIZE;
		* y=Q->data[Q->front];
	}
}
/*销毁队列*/
void Destory_SeqQueue(PSeqQueue * Q){
	if(* Q)
		free(* Q);
	* Q=NULL;
}


/*先序创建二叉树*/
BTree CreateBinTree(void){
	BTree t;
	char ch=getchar();
	if(ch=='#')
		t=NULL;//读入#时,将相应节点指针置空
	else{
		t=(Bnode *)malloc(sizeof(Bnode));
		t->data=ch;
		t->lchild=CreateBinTree();//构造二叉树的左子树
		t->rchild=CreateBinTree();//构造二叉树的右子树
	}
	return t;
}

/******************************层序遍历******************************/
void LevelOrder(BTree t){
	BTree p;
	PSeqQueue Q=Init_SeqQueue();
	if(t)
		In_SeqQueue(Q,t);

	while(!Empty_SeqQueue(Q)){
		Out_SeqQueue(Q,&p);
		cout<<p->data<<" ";
		if(p->lchild)
			In_SeqQueue(Q,p->lchild);
		if(p->rchild)
			In_SeqQueue(Q,p->rchild);
	}
	Destory_SeqQueue(&Q);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值