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 }
也可以把结束提示符换到下一行输入:
