一.简述
二叉树的遍历主要是先序、中序、后序及对应的递归和非递归算法,共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