1 #include "stdio.h"
2 #include "stdlib.h"
3
4 #define MAXSIZE 100
5 typedef char TElemType;
6 typedef struct BiTNode {
7 TElemType data;
8 struct BiTNode *lchild;
9 struct BiTNode *rchild;
10 } BiTNode, *BiTree;
11
12 //定义函数指针
13 typedef void(*Visit)(BiTree);
14
15 //二叉树的初始化
16 void Init_BiTree(BiTree *T) {
17 *T = NULL;
18 }
19
20 int IsEmpty_BiTree(BiTree *T) {
21 return *T == NULL;
22 }
23
24 //创建二叉树
25 void Create_BiTree(BiTree *T) {
26 char ch;
27 ch = getchar();
28 //当输入的是"#"时,认为该子树为空
29 if (ch == '#')
30 *T = NULL;
31 //创建树结点
32 else {
33 *T = (BiTree) malloc(sizeof(BiTNode));
34 (*T)->data = ch; //生成树结点
35 Create_BiTree(&(*T)->lchild);
36 Create_BiTree(&(*T)->rchild);
37 }
38 }
39
40 void Print_BiTreeNode(BiTree T) {
41 printf("%c ", T->data);
42
43 }
44
45 //先序遍历二叉树
46 void PreOrder_BiTree(BiTree T, Visit visit) {
47 if (!IsEmpty_BiTree(&T)) {
48 visit(T);
49 PreOrder_BiTree(T->lchild, visit);
50 PreOrder_BiTree(T->rchild, visit);
51 }
52 }
53
54 //中序遍历二叉树
55 void InOrder_BiTree(BiTree T, Visit visit) {
56 if (!IsEmpty_BiTree(&T)) {
57 InOrder_BiTree(T->lchild, visit);
58 visit(T);
59 InOrder_BiTree(T->rchild, visit);
60 }
61 }
62
63 //后序遍历二叉树
64 void PostOrder_BiTree(BiTree T, Visit visit) {
65 if (!IsEmpty_BiTree(&T)) {
66 PostOrder_BiTree(T->lchild, visit);
67 PostOrder_BiTree(T->rchild, visit);
68 visit(T);
69 }
70 }
71
72 //层次遍历二叉树
73 void LevelOrder_BiTree(BiTree T, Visit visit) {
74 //用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现
75 int front = 0;
76 int rear = 0;
77 BiTree BiQueue[MAXSIZE];
78 BiTree tempNode;
79 if (!IsEmpty_BiTree(&T)) {
80 //将根结点加入到队列中
81 BiQueue[rear++] = T;
82
83 while (front != rear) {
84 //取出队头元素,并使队头指针向后移动一位
85 tempNode = BiQueue[front++];
86 //判断左右子树是否为空,若为空,则加入队列
87 if (!IsEmpty_BiTree(&(tempNode->lchild)))
88 BiQueue[rear++] = tempNode->lchild;
89
90 if (!IsEmpty_BiTree(&(tempNode->rchild)))
91 BiQueue[rear++] = tempNode->rchild;
92 visit(tempNode);
93 }
94 }
95 }
96
97 int main() {
98 BiTree T;
99 Init_BiTree(&T);
100 Create_BiTree(&T);
101 printf("\n先序遍历结果:");
102 PreOrder_BiTree(T, Print_BiTreeNode);
103 printf("\n中序遍历结果:");
104 InOrder_BiTree(T, Print_BiTreeNode);
105 printf("\n后序遍历结果:");
106 PostOrder_BiTree(T, Print_BiTreeNode);
107 printf("\n层次遍历结果:");
108 LevelOrder_BiTree(T, Print_BiTreeNode);
109 return 0;
110 }