1 /*
2 树 二叉树
3 LJK 2018-07-05
4 */
5 #include<stdio.h>
6 #include<stdlib.h>
7 #include<math.h>
8
9 #define OK 1
10 #define ERROR 0
11 #define TRUE 1
12 #define FALSE 0
13
14 typedef int Status;
15 typedef char TElemType;
16
17 // 节点结构
18 typedef struct biTNode
19 {
20 TElemType data; // 节点数据
21 struct biTNode *lchild, *rchild; // 左右孩子指针
22 }BiTNode;
23
24 int index = 0;
25 char String[] = "AB#D##C##";
26
27 // 构造空二叉树
28 Status InitBiTree(BiTNode **T)
29 {
30 *T = NULL;
31 return OK;
32 }
33
34 // 按前序输入二叉树中节点的值(一个字符),#表示空树,构造二叉链表表示二叉树
35 void CreateBiTree(BiTNode **T)
36 {
37 TElemType ch;
38 ch = String[index++];
39
40 if (ch == '#') *T = NULL;
41 else
42 {
43 *T = (BiTNode *)malloc(sizeof(BiTNode));
44 if (!(*T)) exit(OVERFLOW);
45 (*T)->data = ch;
46 CreateBiTree(&(*T)->lchild);
47 CreateBiTree(&(*T)->rchild);
48 }
49 }
50
51 // 若T为空二叉树,则返回TRUE,否则返回FALSE
52 Status BiTreeEmpty(BiTNode *T)
53 {
54 if (T) return false;
55 else return TRUE;
56 }
57
58 // 返回树的深度
59 int BiTreeDepth(BiTNode *T)
60 {
61 int i, j;
62 if (!T) return 0;
63 if (T->lchild) i = BiTreeDepth(T->lchild);
64 else i = 0;
65 if (T->rchild) j = BiTreeDepth(T->rchild);
66 else j = 0;
67 return i > j ? i + 1 : j + 1;
68 }
69
70 // 若存在,返回T的根
71 TElemType Root(BiTNode *T)
72 {
73 if (BiTreeEmpty(T)) return ' ';
74 else return T->data;
75 }
76
77 // 前序递归遍历树
78 void PreOrderTraverse(BiTNode *T)
79 {
80 if (!T) return;
81 printf("%c ", T->data);
82 PreOrderTraverse(T->lchild);
83 PreOrderTraverse(T->rchild);
84 }
85
86 // 中序递归遍历树
87 void InOrderTraverse(BiTNode *T)
88 {
89 if (!T) return;
90 InOrderTraverse(T->lchild);
91 printf("%c ", T->data);
92 InOrderTraverse(T->rchild);
93 }
94
95 // 后序递归遍历树
96 void PostOrderTraverse(BiTNode *T)
97 {
98 if (!T) return;
99 PostOrderTraverse(T->lchild);
100 PostOrderTraverse(T->rchild);
101 printf("%c ", T->data);
102 }
103
104 // 清空二叉树
105 void ClearBiTree(BiTNode **T)
106 {
107 if (*T)
108 {
109 if ((*T)->lchild)
110 ClearBiTree(&(*T)->lchild);
111 if ((*T)->rchild)
112 ClearBiTree(&(*T)->rchild);
113 free(*T);
114 *T = NULL;
115 }
116 }
117
118 int main()
119 {
120 // A
121 // / \
122 // B C
123 // \
124 // D
125 BiTNode *t; // 头指针
126 TElemType e1;
127 int i;
128
129 InitBiTree(&t);
130 printf("初始化后,树空否?%d (1:空 0:非空)\n\n", BiTreeEmpty(t));
131
132 CreateBiTree(&t);
133 printf("构造空二叉树后,树空否? %d (1:空 0:非空)\n", BiTreeEmpty(t));
134 printf("构造空二叉树后,树的深度 = %d\n\n", BiTreeDepth(t));
135
136 e1 = Root(t);
137 printf("RooTree = %c\n\n", e1);
138
139 printf("前序遍历二叉树: ");
140 PreOrderTraverse(t);
141 printf("\n\n");
142
143 printf("中序遍历二叉树: ");
144 InOrderTraverse(t);
145 printf("\n\n");
146
147 printf("后序遍历二叉树: ");
148 PostOrderTraverse(t);
149 printf("\n\n");
150
151 ClearBiTree(&t);
152 printf("After ClearTree is Empty? %d (1:Yes 0:NO) TreeDepth = %d\n", BiTreeEmpty(t), BiTreeDepth(t));
153 i = Root(t);
154 if (i == ' ') printf("Tree Empty No Root.\n");
155 getchar();
156 return 0;
157 }