1 #include"stdio.h"
2 #include"stdlib.h"
3 #define maxsize 100
4 //二叉树链表类型定义
5 typedef struct node{
6 char data;
7 struct node *lchild;//左指针
8 struct node *rchild;//右指针
9 }BTreeNode;
10 //二叉树创建
11 BTreeNode *create(){
12 BTreeNode *s;
13 BTreeNode *q[maxsize];//设置数组,存放每个结点的地址值
14 int i,j;
15 char x;
16 printf("***开始创建***\n");
17 printf("i,x=");
18 scanf("%d,%c",&i,&x);
19 if(i==0)//如果二叉树为空
20 {
21 q[1]=NULL;
22 }
23 while(i!=0&&x!='s')//当i=0,x='s',结束结点创建
24 {
25 s=(BTreeNode*)malloc(sizeof(BTreeNode));//申请内存
26 s->data=x;
27 s->lchild=NULL;
28 s->rchild=NULL;
29 q[i]=s;
30 if(i!=1)//非根节点,寻找双亲结点的地址
31 {
32 j=i/2;//j为双亲结点的地址
33 if(i%2==0)//左孩子
34 {
35 q[j]->lchild=s;
36 } else{//右孩子
37 q[j]->rchild=s;
38 }
39 }
40 printf("i,x=");
41 scanf("%d,%c",&i,&x);
42 }
43
44
45 return q[1];//返回根结点
46 }
47
48 //二叉树遍历
49 //1、先序遍历
50 void preOrder(BTreeNode *Tree){
51 if(Tree){
52 printf("%c",Tree->data);//输出根结点
53 preOrder(Tree->lchild);//左结点输出
54 preOrder(Tree->rchild);//右结点输出
55 }
56
57 }
58 //中序遍历
59 void inOrder(BTreeNode *Tree){
60 if(Tree){
61 inOrder(Tree->lchild);//左结点输出
62 printf("%c",Tree->data);//输出根结点
63 inOrder(Tree->rchild);//右结点输出
64 }
65
66 }
67 //后序遍历
68 void postOrder(BTreeNode *Tree){
69 if(Tree){
70 postOrder(Tree->lchild);//左结点输出
71 postOrder(Tree->rchild);//右结点输出
72
73 printf("%c",Tree->data);//输出根结点
74
75 }
76
77 }
78 //层次遍历
79 void levelOrder(BTreeNode *Tree){
80 BTreeNode *p,*q[maxsize];
81 int rear=0,front=0;
82 if(Tree){
83 p=Tree;
84 q[rear]=p;//根结点入队
85 rear=(rear+1)%maxsize;//尾指针后移
86 while(front!=rear)//当队列不为空
87 {
88 p=q[front];//取队头元素
89 printf("%c",p->data);
90 front=(front+1 )%maxsize;//头指针后移
91 if(p->lchild){//如果左孩子不为空,左孩子入队
92 q[rear]=p->lchild;
93 rear=(rear+1)%maxsize;
94 }
95 if(p->rchild){//如果右孩子不为空,右孩子入队
96 q[rear]=p->rchild;
97 rear=(rear+1)%maxsize;
98 }
99 }
100 }
101
102 }
103 int main(){
104 BTreeNode *Tree=create();//创建二叉树
105 printf("先序遍历:\n");
106 preOrder(Tree);
107 printf("\n中序遍历:\n");
108 inOrder(Tree);
109 printf("\n后序遍历:\n");
110 postOrder(Tree);
111 printf("\n层次遍历:\n");
112 levelOrder(Tree);
113
114 }