c语言实现按层次(广度优先)非递归遍历二叉链树
1 #include<stdio.h> 2 #include<conio.h>
4 #include<malloc.h> 5 typedef char datatype; //字符类型 内容 6 typedef struct node{ //二叉链树数据结构 7 datatype data; 8 struct node *lchild,*rchild; 9 }bitree; 10 bitree *CreatTree(){ //上一篇的建立二叉链树的函数和这里的一模一样,欢迎看上一篇的关于建立树的注释 11 char ch; 12 bitree *Q[100]; 13 int front,rear; 14 bitree *root,*s; 15 root=NULL; 16 front=1,rear=0; 17 while((ch=getchar())!='#') 18 { 19 s=NULL; 20 if(ch!='@'){ 21 s=(bitree*)malloc(sizeof(bitree)); 22 s->data=ch; 23 s->lchild=NULL; 24 s->rchild=NULL; 25 } 26 rear++; 27 Q[rear]=s; 28 if(rear==1) 29 root=s; 30 else{ 31 if(s&&Q[front]){ 32 if(rear%2==0) 33 Q[front]->lchild=s; 34 else 35 Q[front]->rchild=s; 36 } 37 if(rear%2==1) 38 front++; 39 } 40 } 41 return root; 42 } 43 void BianLi(bitree *p){ //层次遍历二叉树的函数,其实和建立二叉树的思想很相似,都是用到下面的“队列数组”,p是要访问的树的根结点 44 bitree *Q[100]; //队列数组,存放bitree节点指针 45 bitree *s; //当前遍历的节点 46 int rear=1,front=0; 47 Q[rear]=p; //最先把头结点p入队 48 while(front<rear){ //队列数组不为空,则进入(继续)循环 49 front++; 50 s=Q[front]; //当前的节点入队 51 printf("%c",s->data); //访问元素 52 if(s->lchild!=NULL) //左孩子存在,则左孩子入队 53 { 54 rear++; 55 Q[rear]=s->lchild; 56 } 57 if(s->rchild!=NULL) //右孩子存在,则右孩子入队 58 { 59 rear++; 60 Q[rear]=s->rchild; 61 } 62 } 63 } 64 int main() 65 { 66 bitree *root; 67 root=CreatTree(); 68 BianLi(root); 69 return 0; 70 }
![](https://images2018.cnblogs.com/blog/1233571/201711/1233571-20171127142224300-1142960384.png)
也可以把结束提示符换到下一行输入:
![](https://images2018.cnblogs.com/blog/1233571/201711/1233571-20171127142441331-1016001718.png)