#include<stdlib.h>
#include<stdio.h>
//#include<bits/stdc++.h>
//二叉树层序遍历
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct LinkNode{
BiTNode *data;//存指针
struct LinkNode *next;
}LinkNode;
typedef struct LinkQueue{
LinkNode *front,*rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
Q.front=NULL;
Q.rear=NULL;
}
bool IsEmpty(LinkQueue Q){
if(Q.front==NULL)return true;
else return false;
}
void EnQueue(LinkQueue &Q,BiTree p){
//char x;
LinkNode *s;
//p=(BiTNode *)malloc(sizeof(BiTNode));//申请一个树结点
s=(LinkNode *)malloc(sizeof(LinkNode));//申请一个LinkNode s->data=p;
//p->data=x;
s->data=p;
s->next=NULL;
if(Q.front==NULL){
Q.front=s;
Q.rear=s;
}else{
Q.rear->next=s;
Q.rear=s;
}
}
//出队
void DeQueue(LinkQueue &Q,BiTree &p){//&p,需要传回去
LinkNode *s=Q.front;
p=Q.front->data;
Q.front=s->next;
if(Q.rear==s){
Q.front=NULL;
Q.rear=NULL;
}
free(s);
}
void visit(BiTree p){
printf("%c ",p->data);
}
//层序遍历
void LevelOrder(BiTree T){
LinkQueue Q;
InitQueue(Q);
BiTree p; //下一个根结点
EnQueue(Q,T); //根结点入队
while(!IsEmpty(Q)){
DeQueue(Q,p);//队头结点出队
visit(p); //访问根结点
if(p->lchild!=NULL)EnQueue(Q,p->lchild);//左孩子入队
if(p->rchild!=NULL)EnQueue(Q,p->rchild);//右孩子入队
}
}
void buildTree(BiTree &T){
char ch;
scanf("%c",&ch); //ab#d##c#e##
if(ch=='#') T=NULL; //#表示空结点
else{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=NULL;
T->rchild=NULL;
buildTree(T->lchild);
buildTree(T->rchild);
}
}
int main(){
BiTree T;
buildTree(T);
LevelOrder(T);
return 0;
}
递归建立二叉树(前序遍历),并进行层序遍历输出二叉树。
最新推荐文章于 2023-06-27 13:30:00 发布