<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Slyar Home &#187; 二叉树</title>
	<atom:link href="http://www.slyar.com/blog/tag/%e4%ba%8c%e5%8f%89%e6%a0%91/feed" rel="self" type="application/rss+xml" />
	<link>http://www.slyar.com/blog</link>
	<description>Beijing Normal University Zhuhai Campus</description>
	<lastBuildDate>Thu, 02 Sep 2010 07:04:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C程序实践 哈夫曼(Huffman)树代码</title>
		<link>http://www.slyar.com/blog/huffman-tree-code-c.html</link>
		<comments>http://www.slyar.com/blog/huffman-tree-code-c.html#comments</comments>
		<pubDate>Fri, 04 Dec 2009 04:20:21 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二叉树]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=1117</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
实验课内容的代码，无聊发出来。
功能包括从文件中读取文章，将文章转换为哈夫曼编码，将哈夫曼编码还原，就是那几个基本算法的实现啦。
为了方便查看，这里输出的哈夫曼编码是1byte的，其实真正应该将其变为1bit存储，这样才能达到压缩的目的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
/*
Slyar
2009.10.29
*/
&#160;
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;io.h&#62;
&#160;
#define N 255
#define M 2*N - 1
&#160;
/* 运行成功标记 */
int ok = 0;
&#160;
/* 保存原文件名 */
char file&#91;20&#93; = &#123;&#125;;
&#160;
/* 哈夫曼树节点类型 */
typedef struct
&#123;
    int data; /* 字符值 */
    int weight; /* 权重 */
    int parent; /* 双亲结点 */
    int [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>实验课内容的代码，无聊发出来。</p>
<p>功能包括从文件中读取文章，将文章转换为哈夫曼编码，将哈夫曼编码还原，就是那几个基本算法的实现啦。</p>
<p>为了方便查看，这里输出的哈夫曼编码是1byte的，其实真正应该将其变为1bit存储，这样才能达到压缩的目的。</p>
<p><span id="more-1117"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
Slyar
2009.10.29
*/</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;io.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define N 255</span>
<span style="color: #339933;">#define M 2*N - 1</span>
&nbsp;
<span style="color: #808080">/* 运行成功标记 */</span>
<span style="color: #993333;">int</span> ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 保存原文件名 */</span>
<span style="color: #993333;">char</span> file<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 哈夫曼树节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> data<span style="color: #339933;">;</span> <span style="color: #808080">/* 字符值 */</span>
    <span style="color: #993333;">int</span> weight<span style="color: #339933;">;</span> <span style="color: #808080">/* 权重 */</span>
    <span style="color: #993333;">int</span> parent<span style="color: #339933;">;</span> <span style="color: #808080">/* 双亲结点 */</span>
    <span style="color: #993333;">int</span> lchild<span style="color: #339933;">;</span> <span style="color: #808080">/* 左孩子结点 */</span>
    <span style="color: #993333;">int</span> rchild<span style="color: #339933;">;</span> <span style="color: #808080">/* 右孩子结点 */</span>
<span style="color: #009900;">&#125;</span>Tree<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 哈夫曼编码类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #808080">/* 存放哈夫曼码 */</span>
    <span style="color: #993333;">char</span> cd<span style="color: #009900;">&#91;</span>N<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
    <span style="color: #993333;">int</span> start<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>Code<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 生成节点及编码数组 */</span>
Tree ht<span style="color: #009900;">&#91;</span>M<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
Code hcd<span style="color: #009900;">&#91;</span>N<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">int</span> cmp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span><span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> NumberOfChar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Reset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InputFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Encode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> Decode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> OutputFile<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PrintHuffmanCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> CreateHT<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> CreateHCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> x <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> n <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;1. 读入原文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;2. 在屏幕上打印哈夫曼代码表<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;3. 编码原文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;4. 解码原文件<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;5. 退出<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Input 1-5:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">:</span>
                Reset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                InputFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #808080">/* 排序使得有效字符在前面 */</span>
                    qsort<span style="color: #009900;">&#40;</span>ht<span style="color: #339933;">,</span> N<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>Tree<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #808080">/* 记下有效字符的个数 */</span>
                    n <span style="color: #339933;">=</span> NumberOfChar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    CreateHT<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    CreateHCode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    OutputFile<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">:</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    PrintHuffmanCode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件尚未读入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">:</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    Encode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件尚未读入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">:</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ok<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    Decode<span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件尚未读入!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">:</span>
                <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
                <span style="color: #808080">/* 防止输入错误序号，刷新缓冲区 */</span>
                fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 快速排序比较函数 */</span>
<span style="color: #993333;">int</span> cmp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>a <span style="color: #339933;">,</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>Tree <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>a<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&lt;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>Tree <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>b<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">?</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">:</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 统计有效的字符数量 */</span>
<span style="color: #993333;">int</span> NumberOfChar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> num <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> N<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> num<span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> num<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 初始化哈夫曼树 */</span>
<span style="color: #993333;">void</span> Reset<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> M<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 读入文件内容 */</span>
<span style="color: #993333;">void</span> InputFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;请输入原文件名:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fflush<span style="color: #009900;">&#40;</span>stdin<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 打开原文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到原文件 %s!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 读入字符并处理权重 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fscanf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        ht<span style="color: #009900;">&#91;</span>ch<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">=</span> ch<span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>ch<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">++;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;原文件 %s 读入成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ok <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 编码 */</span>
<span style="color: #993333;">void</span> Encode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 利用哈夫曼代码表进行编码 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>access<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Huffman_Code.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到代码表 Huffman_Code.txt !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 打开要编码的原文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到原文件 %s !<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> file<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 生成编码文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Encode.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;编码文件 Encode.txt 创建失败!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 一个字符一个字符替换 */</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">==</span> ch<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">start</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;编码成功，结果在 Encode.txt 中!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 解码 */</span>
<span style="color: #993333;">void</span> Decode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 打开要解码的文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Encode.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;找不到编码文件 Encode.txt!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 生成解码文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Decode.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;解码文件 Decode.txt 创建失败!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 利用哈夫曼树解码 */</span>
    i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> EOF<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'0'</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            i <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span>
        <span style="color: #009900;">&#123;</span>
            i <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #808080">/* 找到叶子节点为止 */</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #808080">/* 继续从根节点开始查找 */</span>
            i <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;解码成功，结果在 Decode.txt 中!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 输出哈弗曼编码到文件 */</span>
<span style="color: #993333;">void</span> OutputFile<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    FILE <span style="color: #339933;">*</span>fp<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 生成哈夫曼代码表文件 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Huffman_Code.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wt+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;代码表文件 Huffman_Code.txt 创建失败!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 将内存里的东西写入文件 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d &quot;</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">start</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&lt;</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> fprintf<span style="color: #009900;">&#40;</span>fp<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #808080">/* 关闭文件指针 */</span>
    fclose<span style="color: #009900;">&#40;</span>fp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;代码表文件 Huffman_Code.txt 生成成功!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 打印哈夫曼编码到屏幕 */</span>
<span style="color: #993333;">void</span> PrintHuffmanCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ASCII <span style="color: #000099; font-weight: bold;">\t</span> Char <span style="color: #000099; font-weight: bold;">\t</span> HuffmanCode<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d <span style="color: #000099; font-weight: bold;">\t</span> <span style="color: #000099; font-weight: bold;">\&quot;</span>%c<span style="color: #000099; font-weight: bold;">\&quot;</span> <span style="color: #000099; font-weight: bold;">\t</span> &quot;</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #339933;">,</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">start</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 构造哈夫曼树 */</span>
<span style="color: #993333;">void</span> CreateHT<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> k <span style="color: #339933;">,</span>lmin<span style="color: #339933;">,</span> rmin<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> min1<span style="color: #339933;">,</span> min2<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 一共有2n-1个节点 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">2</span> <span style="color: #339933;">*</span> n <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/*lmin和rmin为最小权重的两个节点置*/</span>
        min1 <span style="color: #339933;">=</span> min2 <span style="color: #339933;">=</span> <span style="color: #208080;">0x7FFFFFFF</span><span style="color: #339933;">;</span>
        lmin <span style="color: #339933;">=</span> rmin <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;=</span> i <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> k<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/*只在尚未构造二叉树的节点中查找*/</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&lt;</span> min1<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    min2 <span style="color: #339933;">=</span> min1<span style="color: #339933;">;</span>
                    rmin <span style="color: #339933;">=</span> lmin<span style="color: #339933;">;</span>
                    min1 <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">;</span>
                    lmin <span style="color: #339933;">=</span> k<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">&lt;</span> min2<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    min2 <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">;</span>
                    rmin <span style="color: #339933;">=</span> k<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* 修改2个小权重节点的双亲 */</span>
        ht<span style="color: #009900;">&#91;</span>lmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>rmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 修改双亲的权重 */</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>lmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span> <span style="color: #339933;">+</span> ht<span style="color: #009900;">&#91;</span>rmin<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">weight</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 修改双亲的孩子 */</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">=</span> lmin<span style="color: #339933;">;</span>
        ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span> <span style="color: #339933;">=</span> rmin<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 得到哈夫曼编码 */</span>
<span style="color: #993333;">void</span> CreateHCode<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> f<span style="color: #339933;">,</span> c<span style="color: #339933;">;</span>
    Code hc<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #808080">/* 根据哈夫曼树求哈夫曼编码 */</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        hc.<span style="color: #202020;">start</span> <span style="color: #339933;">=</span> n<span style="color: #339933;">;</span>
        c <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
        f <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080">/* 循序直到树根结点 */</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>f <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 处理左孩子结点 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ht<span style="color: #009900;">&#91;</span>f<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">==</span> c<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                hc.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>hc.<span style="color: #202020;">start</span><span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'0'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* 处理右孩子结点 */</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                hc.<span style="color: #202020;">cd</span><span style="color: #009900;">&#91;</span>hc.<span style="color: #202020;">start</span><span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'1'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            c <span style="color: #339933;">=</span> f<span style="color: #339933;">;</span>
            f <span style="color: #339933;">=</span> ht<span style="color: #009900;">&#91;</span>f<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">parent</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #808080">/* start指向哈夫曼编码最开始字符 */</span>
        hc.<span style="color: #202020;">start</span><span style="color: #339933;">++;</span>
        hcd<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> hc<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/huffman-tree-code-c.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>二叉树任意两点间最短路径长度 C语言暴力版</title>
		<link>http://www.slyar.com/blog/binary-tree-shortest-path.html</link>
		<comments>http://www.slyar.com/blog/binary-tree-shortest-path.html#comments</comments>
		<pubDate>Sat, 23 May 2009 08:06:45 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=713</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
数据结构课的实验题目，涉及到LCA问题，这次暴力解决了，以后学了NB算法回来做个对比...
问题描述:
设计一个算法，计算出给定二叉树中任意2个结点之间的最短路径。
编程任务:
对于给定的二叉树，和二叉树中结点对，编程计算结点对之间的最短路径。
数据输入:
由文件input.txt给出输入数据。第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n。接下来的n行中，每行有3个正整数a,b,c，分别表示编号为a的结点的左儿子结点编号为b，右儿子结点编号为c。各结点信息按照层序列表的顺序给出。
文件的第n+2行是1个正整数m，表示要计算最短路径的m个结点对。接下来的m行，每行2 个正整数，是要计算最短路径的结点编号。
结果输出:
将编程计算出的m个结点对的最短路径长度输出到文件output.txt。每行3 个正整数，前2 个是结点对编号，第3 个是它们的最短路径长度。
输入文件示例input.txt
9
1 2 3
2 4 5
3 0 0
4 0 0
5 6 7
6 0 0
7 8 9
8 0 0
9 0 0
5
6 9
3 8
4 7
2 9
4 6
输出文件示例output.txt
6 9 3
3 8 5
4 7 3
2 9 3
4 6 3
Tips:因为题目中的2句话，使得这题变得很简单...
1、"第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n"
2、"各结点信息按照层序列表的顺序给出"
第一句话说明如果我们用数组来存结点，并且从下标1开始，那么结点的值和结点的下标是一样的...
第二句话说明编号小的结点一定在编号大的结点的上方...
这样我们只需要求出2个结点到最近公共祖先结点的路径长度，然后将其相加就可以得到2个结点的最短路径了...
不过 最近公共祖先(Least Common Ancestors) 问题貌似还是比较高级的玩意，貌似还要用并查集...反正咱现在不会，以后研究了再修改...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
求二叉树任意两节点最短路径长度
Slyar
http://www.slyar.com
2009.5.22
*/
#include &#60;stdio.h&#62;
#include &#60;malloc.h&#62;
&#160;
/* 二叉树节点定义 */
typedef struct node
&#123;
	int data;
	int lchild;
	int rchild;
&#125;bitree;
&#160;
/* [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>数据结构课的实验题目，涉及到LCA问题，这次暴力解决了，以后学了NB算法回来做个对比...</p>
<p><span style="color: #0000ff;">问题描述:</span></p>
<p>设计一个算法，计算出给定二叉树中任意2个结点之间的最短路径。</p>
<p><span style="color: #0000ff;">编程任务:</span></p>
<p>对于给定的二叉树，和二叉树中结点对，编程计算结点对之间的最短路径。</p>
<p><span style="color: #0000ff;">数据输入:</span></p>
<p>由文件input.txt给出输入数据。第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n。接下来的n行中，每行有3个正整数a,b,c，分别表示编号为a的结点的左儿子结点编号为b，右儿子结点编号为c。各结点信息按照层序列表的顺序给出。</p>
<p>文件的第n+2行是1个正整数m，表示要计算最短路径的m个结点对。接下来的m行，每行2 个正整数，是要计算最短路径的结点编号。</p>
<p><span style="color: #0000ff;">结果输出:</span></p>
<p>将编程计算出的m个结点对的最短路径长度输出到文件output.txt。每行3 个正整数，前2 个是结点对编号，第3 个是它们的最短路径长度。</p>
<p><span id="more-713"></span><span style="color: #0000ff;">输入文件示例input.txt</span></p>
<p>9<br />
1 2 3<br />
2 4 5<br />
3 0 0<br />
4 0 0<br />
5 6 7<br />
6 0 0<br />
7 8 9<br />
8 0 0<br />
9 0 0<br />
5<br />
6 9<br />
3 8<br />
4 7<br />
2 9<br />
4 6</p>
<p><span style="color: #0000ff;">输出文件示例output.txt</span></p>
<p>6 9 3<br />
3 8 5<br />
4 7 3<br />
2 9 3<br />
4 6 3</p>
<p><span style="color: #ff0000;">Tips:</span>因为题目中的2句话，使得这题变得很简单...</p>
<p>1、"第1行有1个正整数n，表示给定的二叉树有n个顶点，编号为1，2，…，n"</p>
<p>2、"各结点信息按照层序列表的顺序给出"</p>
<p>第一句话说明如果我们用数组来存结点，并且从下标1开始，那么结点的值和结点的下标是一样的...</p>
<p>第二句话说明编号小的结点一定在编号大的结点的上方...</p>
<p>这样我们只需要求出2个结点到最近公共祖先结点的路径长度，然后将其相加就可以得到2个结点的最短路径了...</p>
<p>不过 最近公共祖先(Least Common Ancestors) 问题貌似还是比较高级的玩意，貌似还要用并查集...反正咱现在不会，以后研究了再修改...</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
求二叉树任意两节点最短路径长度
Slyar
http://www.slyar.com
2009.5.22
*/</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;malloc.h&gt;</span>
&nbsp;
<span style="color: #808080">/* 二叉树节点定义 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> data<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> lchild<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> rchild<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>bitree<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 定义全局变量 */</span>
<span style="color: #993333;">int</span> n<span style="color: #339933;">,</span> dis<span style="color: #339933;">,</span> sign<span style="color: #339933;">;</span>
bitree <span style="color: #339933;">*</span>t<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
<span style="color: #993333;">int</span> Search<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> ShortestPath<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> GetPathLength<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> m<span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> start<span style="color: #339933;">,</span> end<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> length<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 定义文件指针 */</span>
	FILE <span style="color: #339933;">*</span>fp1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>fp2<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 以只读方式打开输入文件 input.txt */</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp1 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;input.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot open this file.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 动态分配空间 */</span>
	t <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>bitree<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> calloc<span style="color: #009900;">&#40;</span>n <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>bitree<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 读入二叉树 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> n<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d%d%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>a<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>b<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">=</span> a<span style="color: #339933;">;</span>
		t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span> <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
		t<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span> <span style="color: #339933;">=</span> c<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>m<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 以写入方式打开输出文件 output.txt */</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>fp2 <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;output.txt&quot;</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Cannot open this file.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>m<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		fscanf<span style="color: #009900;">&#40;</span>fp1<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d %d&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>start<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 求解最短路径 */</span>
		length <span style="color: #339933;">=</span> ShortestPath<span style="color: #009900;">&#40;</span>start<span style="color: #339933;">,</span> end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		fprintf<span style="color: #009900;">&#40;</span>fp2<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%d %d %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> start<span style="color: #339933;">,</span> end<span style="color: #339933;">,</span> length<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #808080">/* 关闭输入文件 */</span>
	fclose<span style="color: #009900;">&#40;</span>fp1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 关闭输出文件 */</span>
	fclose<span style="color: #009900;">&#40;</span>fp2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 注销分配的空间 */</span>
	free<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 计算最短路径,找最近的共同祖先结点 */</span>
<span style="color: #993333;">int</span> ShortestPath<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> start<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> end<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> dis1<span style="color: #339933;">,</span> dis2<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #808080">/* 共同祖先节点肯定在序号较小结点的上方 */</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>start <span style="color: #339933;">&lt;</span> end <span style="color: #339933;">?</span> start<span style="color: #339933;">:</span>end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #808080">/* 求start节点的祖先结点路径长度 */</span>
		sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis1 <span style="color: #339933;">=</span> GetPathLength<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> start<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 求end节点的祖先结点路径长度 */</span>
		sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		dis2 <span style="color: #339933;">=</span> GetPathLength<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> end<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 如果有共同祖先结点则最短路径为两路径之和 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dis1 <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> dis2 <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #808080">/* 小于0说明起始结点就是要找的，路径长度应为0 */</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dis1 <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> dis1 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dis2 <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> dis2 <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> dis1 <span style="color: #339933;">+</span> dis2<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 求以start为根的二叉树中编号为key的结点路径长度 */</span>
<span style="color: #993333;">int</span> GetPathLength<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> start<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> key<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #808080">/* 遇到叶子结点停止递归 */</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>start <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #808080">/* 找到key就返回。如果起始结点就是要找的，返回-1 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">data</span> <span style="color: #339933;">==</span> key<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #808080">/* 没找到则递归搜索左子树 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sign<span style="color: #009900;">&#41;</span> GetPathLength<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">lchild</span><span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 没找到则递归搜索右子树 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>sign<span style="color: #009900;">&#41;</span> GetPathLength<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#91;</span>start<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">rchild</span><span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #808080">/* 找到key后返回，每次路径长度+1 */</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>sign<span style="color: #009900;">&#41;</span> dis<span style="color: #339933;">++;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> dis<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/binary-tree-shortest-path.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>二叉树的非递归遍历 C语言版</title>
		<link>http://www.slyar.com/blog/bitree-unrecursion-c.html</link>
		<comments>http://www.slyar.com/blog/bitree-unrecursion-c.html#comments</comments>
		<pubDate>Sat, 16 May 2009 15:58:48 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=708</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
上周数据结构课在讲二叉树的遍历，老师只讲递归算法，没有什么技术含量，遂自己琢磨非递归算法实现...
前序遍历:先访问根节点，再访问左子树，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点进栈，在栈不空时一直如下循环:出栈，访问，将其右孩子进栈，再将左孩子进栈。
中序遍历:先访问左子树，再访问根节点，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点的左节点全部进栈，然后出栈一个节点，访问。将该节点的右孩子节点进栈，再将右孩子节点的所有左节点全部进栈...如此这般直到栈空为止。
后序遍历:先访问左子树，再访问右子树，最后访问根节点。设置一个栈。先将根节点的左节点全部进栈。出栈一个节点，将该节点的右孩子进栈，再将右孩子的左节点全部进栈...当一个节点的左、右孩子都被访问过后再访问该节点，如此这般直到栈空为止。(判断某节点的右孩子是否被访问，需要单独设置一个指针跟踪刚刚访问的节点。在后序遍历中，某节点的右孩子节点一定刚好在该节点之前被访问)
因为代码的重点是非递归遍历，所以建立二叉树的过程我就使用了"前序递归"。对于如下一棵树，以"#"代表空节点，前序递归建立二叉树需要的输入数据和前序遍历的顺序是一样的，且每个叶子节点的左右孩子均为"#"。
输入:ABDH##I##EJ##K##CF#L##G##
前序遍历:A B D H I E J K C F L G
中序遍历:H D I B J E K A F L C G
后序遍历:H I D J K E B L F G C A

代码如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
Slyar
http://www.slyar.com
2009.5.16
*/
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
&#160;
#define MAXSIZE 200
&#160;
/* 定义二叉树节点类型 */
typedef struct node
&#123;
    char data;
    struct [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>上周数据结构课在讲二叉树的遍历，老师只讲递归算法，没有什么技术含量，遂自己琢磨非递归算法实现...</p>
<p><span style="color: #0000ff;">前序遍历</span>:先访问根节点，再访问左子树，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点进栈，在栈不空时一直如下循环:出栈，访问，将其右孩子进栈，再将左孩子进栈。</p>
<p><span style="color: #0000ff;">中序遍历</span>:先访问左子树，再访问根节点，最后访问右子树。设置一个栈，出栈即为访问节点。先将根节点的左节点全部进栈，然后出栈一个节点，访问。将该节点的右孩子节点进栈，再将右孩子节点的所有左节点全部进栈...如此这般直到栈空为止。</p>
<p><span style="color: #0000ff;">后序遍历</span>:先访问左子树，再访问右子树，最后访问根节点。设置一个栈。先将根节点的左节点全部进栈。出栈一个节点，将该节点的右孩子进栈，再将右孩子的左节点全部进栈...当一个节点的左、右孩子都被访问过后再访问该节点，如此这般直到栈空为止。(判断某节点的右孩子是否被访问，需要单独设置一个指针跟踪刚刚访问的节点。在后序遍历中，某节点的右孩子节点一定刚好在该节点之前被访问)</p>
<p>因为代码的重点是非递归遍历，所以建立二叉树的过程我就使用了"前序递归"。对于如下一棵树，以"#"代表空节点，前序递归建立二叉树需要的输入数据和前序遍历的顺序是一样的，且每个叶子节点的左右孩子均为"#"。</p>
<p><span style="color: #0000ff;">输入:ABDH##I##EJ##K##CF#L##G##<br />
</span>前序遍历:A B D H I E J K C F L G<br />
中序遍历:H D I B J E K A F L C G<br />
后序遍历:H I D J K E B L F G C A</p>
<p><img class="alignnone size-full wp-image-709" style="border: 1px solid black;" title="二叉树" src="http://www.slyar.com/blog/wp-content/uploads/2009/05/bitree.gif" alt="二叉树" width="246" height="198" /></p>
<p>代码如下:</p>
<p><span id="more-708"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
</pre></td><td class="code"><pre class="c" style="font-family:Verdana,Courier New;"><span style="color: #808080">/*
Slyar
http://www.slyar.com
2009.5.16
*/</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define MAXSIZE 200</span>
&nbsp;
<span style="color: #808080">/* 定义二叉树节点类型 */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> node
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> data<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> node <span style="color: #339933;">*</span>lchild<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>rchild<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>BTNode<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 函数声明 */</span>
BTNode<span style="color: #339933;">*</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PreOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> InOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> PostOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #808080">/* 主函数 */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>root <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    root <span style="color: #339933;">=</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    PreOrder<span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    InOrder<span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    PostOrder<span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    system<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;pause&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 递归前序建立二叉树 */</span>
BTNode<span style="color: #339933;">*</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> ch<span style="color: #339933;">;</span>
    BTNode <span style="color: #339933;">*</span>b<span style="color: #339933;">;</span>
    scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ch<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #808080">/* 遇到空节点停止递归 */</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ch <span style="color: #339933;">==</span> <span style="color: #ff0000;">'#'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        b <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
        b <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>BTNode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 建立根节点 */</span>
        b<span style="color: #339933;">-&gt;</span>data <span style="color: #339933;">=</span> ch<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 递归先序建立左子树 */</span>
        b<span style="color: #339933;">-&gt;</span>lchild <span style="color: #339933;">=</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #808080">/* 递归先序建立右子树 */</span>
        b<span style="color: #339933;">-&gt;</span>rchild <span style="color: #339933;">=</span> CreatBitTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 非递归前序遍历二叉树 */</span>
<span style="color: #993333;">void</span> PreOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>stack<span style="color: #009900;">&#91;</span>MAXSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #808080">/* 根节点入栈 */</span>
        top<span style="color: #339933;">++;</span>
        stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
        <span style="color: #808080">/* 栈不空时循环 */</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 出栈并访问该节点 */</span>
            p <span style="color: #339933;">=</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            top<span style="color: #339933;">--;</span>
            <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c &quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #808080">/* 右孩子入栈 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>rchild <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>rchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* 左孩子入栈 */</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>lchild <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>lchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 非递归中序遍历二叉树 */</span>
<span style="color: #993333;">void</span> InOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>stack<span style="color: #009900;">&#91;</span>MAXSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">||</span> p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* 扫描p的所有左节点并入栈 */</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span>
                p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>lchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 出栈并访问该节点 */</span>
                p <span style="color: #339933;">=</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                top<span style="color: #339933;">--;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c &quot;</span><span style="color: #339933;">,</span> p<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #808080">/* 扫描p的右孩子 */</span>
                p <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>rchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080">/* 非递归后序遍历二叉树 */</span>
<span style="color: #993333;">void</span> PostOrder<span style="color: #009900;">&#40;</span>BTNode<span style="color: #339933;">*</span> b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    BTNode <span style="color: #339933;">*</span>stack<span style="color: #009900;">&#91;</span>MAXSIZE<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> sign<span style="color: #339933;">,</span> top <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">do</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #808080">/* b所有左节点入栈 */</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>b <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                top<span style="color: #339933;">++;</span>
                stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
                b <span style="color: #339933;">=</span> b<span style="color: #339933;">-&gt;</span>lchild<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #808080">/* p指向栈顶前一个已访问节点 */</span>
            p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
            <span style="color: #808080">/* 置b为已访问 */</span>
            sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;&amp;</span> sign<span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #808080">/* 取出栈顶节点 */</span>
                b <span style="color: #339933;">=</span> stack<span style="color: #009900;">&#91;</span>top<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                <span style="color: #808080">/* 右孩子不存在或右孩子已访问则访问b */</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>b<span style="color: #339933;">-&gt;</span>rchild <span style="color: #339933;">==</span> p<span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%c &quot;</span><span style="color: #339933;">,</span> b<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    top<span style="color: #339933;">--;</span>
                    <span style="color: #808080">/* p指向被访问的节点 */</span>
                    p <span style="color: #339933;">=</span> b<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">else</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #808080">/* b指向右孩子节点 */</span>
                    b <span style="color: #339933;">=</span> b<span style="color: #339933;">-&gt;</span>rchild<span style="color: #339933;">;</span>
                    <span style="color: #808080">/* 置未访问标记 */</span>
                    sign <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>top <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/bitree-unrecursion-c.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>已知二叉树的中序序列和前序序列(或后序)求解树</title>
		<link>http://www.slyar.com/blog/binary-tree-traversal.html</link>
		<comments>http://www.slyar.com/blog/binary-tree-traversal.html#comments</comments>
		<pubDate>Mon, 11 May 2009 15:34:27 +0000</pubDate>
		<dc:creator>Slyar</dc:creator>
				<category><![CDATA[编程相关]]></category>
		<category><![CDATA[二叉树]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://www.slyar.com/blog/?p=704</guid>
		<description><![CDATA[文章作者：Slyar 文章来源：Slyar Home (www.slyar.com) 转载请注明，谢谢合作。
今天数据结构课讲树的存储和遍历，老师讲的很简单，也没什么代码要发...唯一看到一个比较重要的东西，总结一下算法好了。
这种题一般有二种形式，共同点是都已知中序序列。如果没有中序序列，是无法唯一确定一棵树的，证明略。
一、已知二叉树的前序序列和中序序列，求解树。
1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。
二、已知二叉树的后序序列和中序序列，求解树。
1、确定树的根。树根是当前树中所有元素在后序遍历中最后出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。
举例说明：根据已知求解二叉树
中序序列 BDCEAFHG
后序序列 DECBHGFA
1、BDCEAFHG在后序序列中最后出现的元素为A，BDCE&#124;A&#124;FHG
2、BDCE在后序序列中最后出现的元素为B，&#124;B&#124;DCE&#124;A&#124;FHG
3、FHG在后序序列中最后出现的元素为F，&#124;B&#124;DCE&#124;A&#124;&#124;F&#124;HG
4、DCE在后序序列中最后出现的元素为C，&#124;B&#124;D&#124;C&#124;E&#124;A&#124;&#124;F&#124;HG
5、HG在后序序列中最后出现的元素为G，&#124;B&#124;D&#124;C&#124;E&#124;A&#124;&#124;F&#124;H&#124;G&#124;
6、所有元素都已经定位，二叉树求解完成。
                 A
              /     \
             [...]]]></description>
			<content:encoded><![CDATA[<p>文章作者：<span style="color: #0000ff;">Slyar </span>文章来源：Slyar Home (<a title="Slyar" href="http://www.slyar.com" target="_blank">www.slyar.com</a>) 转载请注明，谢谢合作。</p>
<p>今天数据结构课讲树的存储和遍历，老师讲的很简单，也没什么代码要发...唯一看到一个比较重要的东西，总结一下算法好了。</p>
<p>这种题一般有二种形式，共同点是都已知中序序列。如果没有中序序列，是无法唯一确定一棵树的，证明略。</p>
<p><span style="color: #0000ff;">一、已知二叉树的前序序列和中序序列，求解树。</span></p>
<p>1、确定树的根节点。<span style="color: #ff0000;">树根是当前树中所有元素在前序遍历中最先出现的元素。</span></p>
<p>2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。</p>
<p>3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。</p>
<p><span style="color: #0000ff;">二、已知二叉树的后序序列和中序序列，求解树。</span></p>
<p>1、确定树的根。<span style="color: #ff0000;">树根是当前树中所有元素在后序遍历中最后出现的元素。</span></p>
<p>2、求解树的子树。找出根节点在中序遍历中的位置，根左边的所有元素就是左子树，根右边的所有元素就是右子树。若根节点左边或右边为空，则该方向子树为空；若根节点左边和右边都为空，则根节点已经为叶子节点。</p>
<p>3、递归求解树。将左子树和右子树分别看成一棵二叉树，重复1、2、3步，直到所有的节点完成定位。</p>
<p><span style="color: #0000ff;">举例说明</span>：根据已知求解二叉树</p>
<p>中序序列 BDCEAFHG<br />
后序序列 DECBHGFA</p>
<p>1、BDCEAFHG在后序序列中最后出现的元素为A，BDCE<span style="color: #800080;">|A|</span>FHG<br />
2、BDCE在后序序列中最后出现的元素为B，<span style="color: #800080;">|B|</span>DCE<span style="color: #800080;">|A|</span>FHG<br />
3、FHG在后序序列中最后出现的元素为F，<span style="color: #800080;">|B|</span>DCE<span style="color: #800080;">|A|</span><span style="color: #800080;">|F|</span>HG<br />
4、DCE在后序序列中最后出现的元素为C，<span style="color: #800080;">|B|</span>D<span style="color: #800080;">|C|</span>E<span style="color: #800080;">|A|</span><span style="color: #800080;">|F|</span>HG<br />
5、HG在后序序列中最后出现的元素为G，<span style="color: #800080;">|B|</span>D<span style="color: #800080;">|C|</span>E<span style="color: #800080;">|A|</span><span style="color: #800080;">|F|</span>H<span style="color: #800080;">|G|</span><br />
6、所有元素都已经定位，二叉树求解完成。</p>
<pre>                 A
              /     \
             B       F
             \        \
              C       G
             /  \     /
            D    E   H</pre>
<p>以前还写过一篇文章<a title="求二叉树的后序遍历" href="http://www.slyar.com/blog/c-preord-inord-tree.html" target="_blank">《求二叉树的后序遍历 C语言 数组实现》</a>，是已知二叉树的前序遍历和后序遍历，求二叉树的后序遍历。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.slyar.com/blog/binary-tree-traversal.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
