二叉树层次遍历(以先序输入)
按层次遍历的原则是先被访问的结点的左右儿子结点也先被访问,因此需引入先进先出的队列作为辅助工具。
算法思想为:
(1)将二叉树根入队列;
(2)循环直到队列为空
(2.1)将队头元素出队列,
(2.2)访问结点数据域,
(2.3)判断此元素是否有左右孩子,若有,则将它的左右孩子依次入队,否则转(2);
#include <iostream> #include <cstdio> #include <malloc.h> using namespace std; #define MAXSIZE 100 typedef char DataType; typedef struct BiTnode { DataType data; struct BiTnode *lchild,*rchild; }BiTNode,*BiTree; typedef struct SQueue { BiTree data[MAXSIZE]; int front,rear; }SQueue,*Queue; BiTree creatTree(BiTree root) { DataType ch; root=(BiTree)malloc(sizeof(BiTNode)); scanf("%c",&ch); if(ch=='#') return 0; root->data=ch; root->lchild=creatTree(root->lchild); root->rchild=creatTree(root->rchild); return root; } void InitQueue(Queue Q) { Q->front=Q->rear=0; } int IsEmptyQueue(Queue Q) { return Q->rear==Q->front?1:0; } void EnQueue(BiTree root,Queue Q) { if((Q->rear+1)%MAXSIZE==Q->front) { printf("Queue is fulled!\n"); return ; } Q->rear=(Q->rear+1)%MAXSIZE; Q->data[Q->rear]=root; } BiTree Gethead(Queue Q) { if(IsEmptyQueue(Q)) return 0; BiTree root; root=Q->data[(Q->front+1)%MAXSIZE]; Q->front=(Q->front+1)%MAXSIZE; return root; } void LevelOrder(BiTree root) { SQueue Q; BiTree t; if(!root) return ; InitQueue(&Q); EnQueue(root,&Q); while(!IsEmptyQueue(&Q)) { t=Gethead(&Q); printf("%c ",t->data); if(t->lchild!=NULL) EnQueue(t->lchild,&Q); if(t->rchild!=NULL) EnQueue(t->rchild,&Q); } } int main() { BiTree tree; tree=creatTree(tree); LevelOrder(tree); return 0; }