1、数据结构二叉树遍历实验报告数据结构-二叉树遍历实验报告数据结构之二叉树实 验 报 告 题目:二叉树的遍历和子树交换 指导老师:杨政宇 班级:通信1202 姓名:徐江 学号:0909121127需求分析1.演示程序分别用多种遍历算法遍历二叉树并把数据输出。2.输入字符序列,递归方式建立二叉树。3.在演示过程序中,用户敲击键盘,输入数据,即可看到数据的输出。4.实现链式存储的二叉树的多种遍历算法。遍历算法包括:a)中序递归遍历算法、前序递归遍历算法【选】b)中序遍历非递归算法c)先序或后序遍历非递归算法d)建立中序线索,并进行中序遍历和反中序遍历5.实现二叉树的按层遍历算法6.设计一个测试用的二叉
2、树并创建对应的内存二叉树,能够测试自己算法的边界(包括树节点数为0、1以及1 的不同情形)。7.测试数据:输入数据:-+a *b -c d -e f 概要设计说明:本程序在递归调用中用到了链表,在非递归调用时用到了栈。1.栈的抽象数据类型ADT Stack数据对象:D=ai|aichar,i=1,2,3.数据关系:R=| ai -1,ai D,i=2,3.基本操作:InitStack(&S) 操作结果:构造一个空栈StackEmpty( S ) 初始条件:栈S已存在。 操作结果:若S为空栈,则返回OK,否则返回ERROR。 Push( &S, e ) 初始条件:栈S已存在。 操作结果:插入元素
3、e为新的栈顶元素。 Pop( &S, &e ) 初始条件:栈S已存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。 GetTop( S, &e ) 初始条件:栈S已存在且非空。操作结果:中序遍历二叉树,并将其中序线索化。InOrderTraverse_Thr( T, print);初始条件:二叉树T在在。操作结果:中序非递归遍历二叉线索树TInThreading(p);初始条件:结点p在在。操作结果:结点p及子树线索化。3.主程序的流程:void main() 初始化; 提示; 执行二叉数ADT函数;4.本程序包含三个模块1)主程序模块void main()初始化;接受命令;显示结果;
4、2)链表模块。递归调用时实现链表抽象数据类型。3)栈模块。非递归调用时实现栈的抽象数据类型。详细设计1.宏定义及全局变量#define TElemType char#define SElemType BiTree#define OK 1#define OVERFLOW 0#define ERROR 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10SqStack S;BiThrTree pre;BiThrTree i;2.函数定义int CreateBiTree(BiTree &T); /创建二叉树void PreOrderTravers
5、e_re(BiTree T,void (*print)(TElemType e); /先序递归遍历二叉树void InOrderTraverse(BiTree T,int (*print)(TElemType e); /中序非递归遍历二叉树void InOrderTraverse_re(BiTree T,int (*print)(TElemType e) ; /中序递归遍历二叉树void PreOrderTraverse(BiTree T,int (*print)(TElemType e); /先序非递归遍历二叉树int print(TElemType e); /打印元素void InitSt
6、ack(SqStack &S); /栈的初始化void Pop(SqStack &S,SElemType &e);void Push(SqStack &S,SElemType &e);int StackEmpty(SqStack S);int GetTop(SqStack S,SElemType &e);void Levelorder(BiTree T) ;void InOrderThreading(BiThrTree &Thrt,BiThrTree T);int InOrderTraverse_Thr(BiThrTree T, int (*print)(TElemType e);void I
7、nThreading(BiThrTree p);3.二叉树链表数据结构:typedef struct BiTNode TElemType data; struct BiTNode *lchild ,*rchild; PointerTag LTag , RTag;BiTNode , *BiTree , BiThrNode , *BiThrTree; 基本操作:a)构造二叉树Tint CreateBiTree(BiTree &T) char ch; scanf(%c,&ch); if(ch= ) T=NULL; else if(!(T=(BiTNode *)malloc(sizeof(BiTNod
8、e) return ERROR; T-data=ch; if (CreateBiTree(T-lchild) T-LTag=Link; if (CreateBiTree(T-rchild) T-RTag=Link; return OK;b)先序递归遍历二叉数T,并输出全部结点值。void PreOrderTraverse_re(BiTree T,int (*print)(TElemType e) if(T) if(print(T-data) PreOrderTraverse_re(T-lchild,print); PreOrderTraverse_re(T-rchild,print); ret
9、urn ; else return ;c)中序非递归遍历二叉树T,并输出全部结点值void InOrderTraverse(BiTree T,int (*print)(TElemType e) SqStack S; S.base=NULL;S.top=NULL; SElemType p=NULL; InitStack(S); Push(S,T); while(!StackEmpty(S) while(GetTop(S,p)&p) Push(S,p-lchild); Pop(S,p); if(!StackEmpty(S) Pop(S,p); print(p-data); Push(S,p-rch
10、ild); return;d)中序递归遍历二叉树T,并输出全部结点值void InOrderTraverse_re(BiTree T,int (*print)(TElemType e) if(T) InOrderTraverse_re(T-lchild,print); print(T-data); InOrderTraverse_re(T-rchild,print); e)中序遍历二叉树T,并将其中序线索化,Thrt指向头结点 void InOrderThreading(BiThrTree &Thrt,BiThrTree T) Thrt=(BiThrTree)malloc(sizeof(BiT
11、hrNode); Thrt-LTag=Link;/建头结点 Thrt-RTag=Thread; Thrt-rchild=Thrt;/右指针回指 if(!T) Thrt-lchild=Thrt; else Thrt-lchild=T; pre=Thrt; InThreading(T);/中序遍历进行中序线索化 pre-rchild=Thrt; pre-RTag=Thread;/最后一个结点线索化 Thrt-rchild=pre; i=Thrt;/InOrderThreadingf)结点p线索化void InThreading(BiThrTree p) if (p) InThreading(p-l
12、child); / 左子树线索化 if (!p-lchild) / 建前驱线索 p-LTag = Thread; p-lchild = pre; if (!pre-rchild) / 建后继线索 pre-RTag = Thread; pre-rchild = p; pre = p; / 保持pre指向p的前驱 InThreading(p-rchild); / 右子树线索化 / InThreadingg)/中序遍历线索化二叉树int InOrderTraverse_Thr(BiThrTree T, int (*print)(TElemType e) BiThrTree p=NULL; p=T-l
13、child; while(p!=T) while(p-LTag=Link) p=p-lchild; if(!print(p-data) return ERROR; while(p-RTag=Thread & p-rchild!=T) p=p-rchild; print(p-data); p=p-rchild; return OK;4.栈数据结构:typedef struct SElemType *base; SElemType *top; int stacksize;SqStack;基本操作:a)创建一个空栈void InitStack(SqStack &S) S.base=(SElemTyp
14、e*)malloc(STACK_INIT_SIZE*sizeof(SElemType); S.top=S.base; /初始为空 S.stacksize=STACK_INIT_SIZE; return;b)栈顶插入元素void Push(SqStack &S,SElemType &e) if(S.top-S.base=S.stacksize) S.base=(SElemType*)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT;