一.简述

  二叉树的遍历主要是先序、中序、后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些。二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具!

  此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改。

  二.头文件

 1 //3_1.h
 2 /**
 3 author:zhaoyu
 4 email:zhaoyu1995.com@gmail.com
 5 date:2016-6-7
 6 note:realize my textbook <<数据结构(C语言版)>>
 7 */
 8 //Page 46
 9 #ifndef _3_1_FOR_CHAPTER6_H_
10 #define _3_1_FOR_CHAPTER6_H_
11 #include <cstdio>
12 #include <cstdlib>
13 #include "head.h"
14 /**
15 My Code
16 */
17 #define SElemType BiTree
18 //----栈的顺序存储表示----
19 #define STACK_INIT_SIZE 100//存储空间的初始分配值
20 #define STACKINCREMENT 10//存储空间分配增量
21 typedef struct{
22     SElemType *base;//在栈构造之前和销毁之后,base 值为 NULL
23     SElemType *top;//栈顶指针
24     int stacksize;//当前已分配的存储空间,以元素为单位
25 }SqStack;
26 //----基本操作的函数原型说明及部分实现----
27 Status InitStack(SqStack &S)
28 {
29     //构造一个空栈 S
30     S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
31     if (!S.base)
32     {
33         exit(OVERFLOW);
34     }
35     S.top = S.base;
36     S.stacksize = STACK_INIT_SIZE;
37     return OK;
38 }//InitStack
39 
40 Status StackEmpty(SqStack S)
41 {
42     //若 S 为空栈, 则返回 TRUE, 否则返回 FALSE
43     if (S.base == S.top)
44     {
45         return TRUE;
46     }
47     else
48     {
49         return FALSE;
50     }
51 }
52 
53 Status GetTop(SqStack S, SElemType &e)
54 {
55     //若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;
56     //否则返回ERROR
57     if (S.top == S.base)
58     {
59         return ERROR;
60     }
61     e = *(S.top - 1);
62     return OK;
63 }//GetTop
64 Status Push(SqStack &S, SElemType e)
65 {
66     //插入元素 e 为新的栈顶元素
67     if (S.top - S.base >= S.stacksize)
68     {//栈满,追加存储空间
69         S.base = (SElemType *)realloc(S.base,
70             (S.stacksize+STACKINCREMENT)*sizeof(SElemType));
71         if (!S.base)
72         {
73             exit(OVERFLOW);
74         }
75         S.top = S.base + S.stacksize;
76         S.stacksize += STACKINCREMENT;
77     }
78     *S.top++ = e;
79     return OK;
80 }//Push
81 Status Pop(SqStack &S, SElemType &e)
82 {
83     //若栈不空,则删除 S 的栈顶元素,用 e 返回其
84     //值,并返回OK;否则返回ERROR
85     if (S.top == S.base)
86     {
87         return ERROR;
88     }
89     e = *--S.top;
90     return OK;
91 }//Pop
92 #endif
3_1_for_chapter6.h

相关文章: