1
- #include < stdio.h>
2
- #include < stdlib.h>
1
+ #include < stdio.h>
2
+ #include < stdlib.h>
3
3
4
4
#define TRUE 1
5
5
#define FALSE 0
8
8
#define OVERFLOW -1
9
9
#define SUCCESS 1
10
10
#define UNSUCCESS 0
11
-
12
11
#define dataNum 5
13
12
int i = 0 ;
14
13
int dep = 0 ;
@@ -17,180 +16,165 @@ char data[dataNum] = { 'A', 'B', 'C', 'D', 'E' };
17
16
typedef int Status;
18
17
typedef char TElemType;
19
18
19
+ // 二叉树结构
20
20
typedef struct BiTNode
21
21
{
22
- TElemType data;
23
- struct BiTNode *lchild, *rchild;
22
+ TElemType data;
23
+ struct BiTNode *lchild, *rchild;
24
24
}BiTNode, *BiTree;
25
25
26
- void InitBiTree (BiTree &T); // 创建一颗空二叉树
27
- BiTree MakeBiTree (TElemType e, BiTree L, BiTree R); // 创建一颗二叉树T,其中根节点的值为e,L和R分别作为左子树和右子树
28
- void DestroyBiTree (BiTree &T); // 销毁二叉树
29
- Status BiTreeEmpty (BiTree T); // 对二叉树判空。若为空返回TRUE,否则FALSE
30
- Status BreakBiTree (BiTree &T, BiTree &L, BiTree &R); // 将一颗二叉树T分解成根、左子树、右子树三部分
31
- Status ReplaceLeft (BiTree &T, BiTree <); // 替换左子树。若T非空,则用LT替换T的左子树,并用LT返回T的原有左子树
32
- Status ReplaceRight (BiTree &T, BiTree &RT); // 替换右子树。若T非空,则用RT替换T的右子树,并用RT返回T的原有右子树
33
-
34
- int Leaves (BiTree T);
35
- int Depth (BiTree T);
36
-
37
- Status visit (TElemType e);
38
- void UnionBiTree (BiTree &Ttemp);
39
-
40
-
41
- // InitBiTree空二叉树是只有一个BiTree指针?还是有一个结点但结点域为空?
26
+ // 初始化一个空树
42
27
void InitBiTree (BiTree &T)
43
28
{
44
- T = NULL ;
29
+ T = NULL ;
45
30
}
46
31
32
+ // 构建二叉树
47
33
BiTree MakeBiTree (TElemType e, BiTree L, BiTree R)
48
34
{
49
- BiTree t;
50
- t = (BiTree)malloc (sizeof (BiTNode));
51
- if (NULL == t) return NULL ;
52
- t->data = e;
53
- t->lchild = L;
54
- t->rchild = R;
55
- return t;
35
+ BiTree t;
36
+ t = (BiTree)malloc (sizeof (BiTNode));
37
+ if (NULL == t) return NULL ;
38
+ t->data = e;
39
+ t->lchild = L;
40
+ t->rchild = R;
41
+ return t;
56
42
}
57
-
43
+
44
+ // 访问结点
58
45
Status visit (TElemType e)
59
46
{
60
- printf (" %c" , e);
61
- return OK;
47
+ printf (" %c" , e);
48
+ return OK;
62
49
}
63
50
64
-
65
- int Leaves (BiTree T) // 对二叉树T求叶子结点数目
51
+ // 对二叉树T求叶子结点数目
52
+ int Leaves (BiTree T)
66
53
{
67
- int l = 0 , r = 0 ;
68
-
69
- if (NULL == T) return 0 ;
70
- if (NULL == T->lchild && NULL == T->rchild ) return 1 ;
71
-
72
- // 问题分解,2个子问题
73
-
74
-
75
- // 求左子树叶子数目
76
- l = Leaves (T->lchild );
77
-
78
- // 求右子树叶子数目
79
- r = Leaves (T->rchild );
80
-
81
- // 组合
82
- return r + l;
54
+ int l = 0 , r = 0 ;
55
+ if (NULL == T) return 0 ;
56
+ if (NULL == T->lchild && NULL == T->rchild ) return 1 ;
57
+
58
+ // 求左子树叶子数目
59
+ l = Leaves (T->lchild );
60
+ // 求右子树叶子数目
61
+ r = Leaves (T->rchild );
62
+ // 组合
63
+ return r + l;
83
64
}
84
65
85
- int depTraverse (BiTree T) // 层次遍历:dep是个全局变量,高度
66
+ // 层次遍历:dep是个全局变量,高度
67
+ int depTraverse (BiTree T)
86
68
{
87
- if (NULL == T) return ERROR;
69
+ if (NULL == T) return ERROR;
88
70
89
- dep = (depTraverse (T->lchild ) > depTraverse (T->rchild )) ? depTraverse (T->lchild ) : depTraverse (T->rchild );
71
+ dep = (depTraverse (T->lchild ) > depTraverse (T->rchild )) ? depTraverse (T->lchild ) : depTraverse (T->rchild );
90
72
91
- return dep + 1 ;
73
+ return dep + 1 ;
92
74
}
93
75
94
-
95
- void levTraverse (BiTree T, Status(*visit)(TElemType e), int lev) // 高度遍历:lev是局部变量,层次
76
+ // 高度遍历:lev是局部变量,层次
77
+ void levTraverse (BiTree T, Status(*visit)(TElemType e), int lev)
96
78
{
97
- if (NULL == T) return ;
98
-
99
- visit (T->data );
100
- printf (" 的层次是%d\n " , lev);
101
-
102
- levTraverse (T->lchild , visit, ++lev);
103
- levTraverse (T->rchild , visit, lev);
79
+ if (NULL == T) return ;
80
+ visit (T->data );
81
+ printf (" 的层次是%d\n " , lev);
104
82
83
+ levTraverse (T->lchild , visit, ++lev);
84
+ levTraverse (T->rchild , visit, lev);
105
85
}
106
86
107
- void InOrderTraverse (BiTree T, Status(*visit)(TElemType e), int &num) // num是个全局变量
87
+ // num是个全局变量
88
+ void InOrderTraverse (BiTree T, Status(*visit)(TElemType e), int &num)
108
89
{
109
- if (NULL == T) return ;
110
- visit (T->data );
111
- if (NULL == T->lchild && NULL == T->rchild ) { printf (" 是叶子结点" ); num++; }
112
- else printf (" 不是叶子结点" );
113
- printf (" \n " );
114
- InOrderTraverse (T->lchild , visit, num);
115
- InOrderTraverse (T->rchild , visit, num);
90
+ if (NULL == T) return ;
91
+ visit (T->data );
92
+ if (NULL == T->lchild && NULL == T->rchild ) { printf (" 是叶子结点" ); num++; }
93
+ else printf (" 不是叶子结点" );
94
+ printf (" \n " );
95
+ InOrderTraverse (T->lchild , visit, num);
96
+ InOrderTraverse (T->rchild , visit, num);
116
97
}
117
98
99
+ // 二叉树判空
118
100
Status BiTreeEmpty (BiTree T)
119
101
{
120
- if (NULL == T) return TRUE ;
121
- return FALSE ;
102
+ if (NULL == T) return TRUE ;
103
+ return FALSE ;
122
104
}
123
105
106
+ // 打断二叉树:置空二叉树的左右子树
124
107
Status BreakBiTree (BiTree &T, BiTree &L, BiTree &R)
125
108
{
126
- if (NULL == T) return ERROR;
127
- L = T->lchild ;
128
- R = T->rchild ;
129
- T->lchild = NULL ;
130
- T->rchild = NULL ;
131
- return OK;
109
+ if (NULL == T) return ERROR;
110
+ L = T->lchild ;
111
+ R = T->rchild ;
112
+ T->lchild = NULL ;
113
+ T->rchild = NULL ;
114
+ return OK;
132
115
}
133
116
117
+ // 替换左子树
134
118
Status ReplaceLeft (BiTree &T, BiTree <)
135
119
{
136
- BiTree temp;
137
- if (NULL == T) return ERROR;
138
- temp = T->lchild ;
139
- T->lchild = LT;
140
- LT = temp;
141
- return OK;
120
+ BiTree temp;
121
+ if (NULL == T) return ERROR;
122
+ temp = T->lchild ;
123
+ T->lchild = LT;
124
+ LT = temp;
125
+ return OK;
142
126
}
143
127
128
+ // 替换右子树
144
129
Status ReplaceRight (BiTree &T, BiTree &RT)
145
130
{
146
- BiTree temp;
147
- if (NULL == T) return ERROR;
148
- temp = T->rchild ;
149
- T->rchild = RT;
150
- RT = temp;
151
- return OK;
131
+ BiTree temp;
132
+ if (NULL == T) return ERROR;
133
+ temp = T->rchild ;
134
+ T->rchild = RT;
135
+ RT = temp;
136
+ return OK;
152
137
}
153
138
139
+ // 合并二叉树
154
140
void UnionBiTree (BiTree &Ttemp)
155
141
{
156
- BiTree L = NULL , R = NULL ;
157
- L = MakeBiTree (data[i++], NULL , NULL );
158
- R = MakeBiTree (data[i++], NULL , NULL );
159
- ReplaceLeft (Ttemp, L);
160
- ReplaceRight (Ttemp, R);
142
+ BiTree L = NULL , R = NULL ;
143
+ L = MakeBiTree (data[i++], NULL , NULL );
144
+ R = MakeBiTree (data[i++], NULL , NULL );
145
+ ReplaceLeft (Ttemp, L);
146
+ ReplaceRight (Ttemp, R);
161
147
}
162
148
163
-
164
149
int main ()
165
150
{
151
+ BiTree T = NULL , Ttemp = NULL ;
166
152
167
- BiTree T = NULL , Ttemp = NULL ;
168
-
169
- InitBiTree (T);
170
- if (TRUE == BiTreeEmpty (T)) printf (" 初始化T为空\n " );
171
- else printf (" 初始化T不为空\n " );
153
+ InitBiTree (T);
154
+ if (TRUE == BiTreeEmpty (T)) printf (" 初始化T为空\n " );
155
+ else printf (" 初始化T不为空\n " );
172
156
173
- T = MakeBiTree (data[i++], NULL , NULL );
157
+ T = MakeBiTree (data[i++], NULL , NULL );
174
158
175
- Ttemp = T;
176
- UnionBiTree (Ttemp);
159
+ Ttemp = T;
160
+ UnionBiTree (Ttemp);
177
161
178
- Ttemp = T->lchild ;
179
- UnionBiTree (Ttemp);
162
+ Ttemp = T->lchild ;
163
+ UnionBiTree (Ttemp);
180
164
165
+ Status (*visit1)(TElemType);
166
+ visit1 = visit;
167
+ int num = 0 ;
168
+ InOrderTraverse (T, visit1, num);
169
+ printf (" 叶子结点是 %d\n " , num);
181
170
182
- Status (*visit1)(TElemType);
183
- visit1 = visit;
184
- int num = 0 ;
185
- InOrderTraverse (T, visit1, num);
186
- printf (" 叶子结点是 %d\n " , num);
171
+ printf (" 叶子结点是 %d\n " , Leaves (T));
187
172
188
- printf (" 叶子结点是 %d\n " , Leaves (T));
173
+ int lev = 1 ;
174
+ levTraverse (T, visit1, lev);
189
175
190
- int lev = 1 ;
191
- levTraverse (T, visit1, lev);
176
+ printf (" 高度是 %d\n " , depTraverse (T));
192
177
193
- printf (" 高度是 %d\n " , depTraverse (T));
194
-
195
- return 0 ;
178
+ getchar ();
179
+ return 0 ;
196
180
}
0 commit comments