#include<stdio.h> #include<stdlib.h> #define OVERFLOW -1 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int status; typedef char TElemType; typedef struct TNode{ TElemType data; struct TNode *lchild,*rchild; }BNode,*BTree; typedef BTree QElemType; //队列元素类型,即二叉树根指针类型 typedef struct QNode{//队列结点类型 QElemType data; struct QNode *next; }QNode,*QLink; typedef struct{//队列类型 QLink front,rear; }Queue; /* 队列的基本操作 */ //初始化一个空队列 status InitQueue(Queue &Q) { Q.front=Q.rear=(QLink)malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; return OK; } //元素e入队 void InQueue(Queue &Q,QElemType e) { QLink s; s=(QLink)malloc(sizeof(QNode)); if(!s) exit(OVERFLOW); s->data=e; s->next=NULL; Q.rear->next=s; Q.rear=s; } //出队,用e返回值 status OutQueue(Queue &Q,QElemType &e) { QLink p; if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(p==Q.rear) Q.rear=Q.front; free(p); return OK; } //判断队空,若空,返回OK status EmptyQueue(Queue Q) { if(Q.front==Q.rear) return TRUE; else return FALSE; } //创建二叉树 status creat(BTree &t) { char ch; ch=getchar(); if(ch==' ') t=NULL; else{ t=(BTree)malloc(sizeof(BNode)); if(!t) exit(OVERFLOW); t->data=ch; creat(t->lchild); creat(t->rchild); } return OK; } //先序访问 void DLR(BTree t) { if(t){ printf("%c",t->data); DLR(t->lchild); DLR(t->rchild); } } //层次访问 void Level(BTree t) { //层次遍历 BTree p; Queue Q; InitQueue(Q);//初始化一个队列 p=t;//p指向树根 if(!p) return;//空树,返回 InQueue(Q,p) ;//非空根指针入队 while(!EmptyQueue(Q))//当队列不空时 { OutQueue(Q,p);//出队一个元素给p printf("%c",p->data);//输出值 if(p->lchild) InQueue(Q,p->lchild);//若有左孩子,左孩子入队 if(p->rchild) InQueue(Q,p->rchild);//若有有孩子,右孩子入队 } } void main() { BTree t=NULL; printf("创建二叉树,空格代表空树\n"); creat(t); printf("建立成功\n"); printf("先序遍历的结果为:\n"); DLR(t); printf("\n层次遍历的结果为:"); Level(t); }