数据结构二叉树遍历实验报告_第1页
数据结构二叉树遍历实验报告_第2页
数据结构二叉树遍历实验报告_第3页
数据结构二叉树遍历实验报告_第4页
数据结构二叉树遍历实验报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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已存在。 操作结果:插入元素e为新的栈顶元素。 pop( &s, &

3、e ) 初始条件:栈s已存在且非空。 操作结果:删除s的栈顶元素,并用e返回其值。 gettop( s, &e ) 初始条件:栈s已存在且非空。 操作结果:用e返回s的栈顶元素。 2.二叉树的抽象数据类型adt binarytree 数据对象d:d是具有相同特性的数据元素的集合。 数据关系r: 若d=,则r=,称binarytree为空二叉树; 若d,则r=h,h是如下二元关系; (1)在d中存在惟一的称为根的数据元素root,它在关系h下无前驱; (2)若d-root,则存在d-root=d1,dr,且d1dr =; (3)若d1,则d1中存在惟一的元素x1,h,且存在d1上的 关系h1 h

4、;若dr,则dr中存在惟一的元素xr,h,且 存在上的关系hr h;h=,h1,hr; (4)(d1,h1)是一棵符合本定义的二叉树,称为根的左子树;(dr,hr)是一 棵符合本定义的二叉树,称为根的右子树。 基本操作: createbitree( &t) 初始条件:给出二叉树t的定义。 操作结果:按要求构造二叉树t。 preordertraverse_re( t, print() ) 初始条件:二叉树t存在,print是二叉树全部结点输出的应用函数。 操作结果:先序递归遍历t,对每个结点调用函数print一次且仅一次。一旦 print()失败,则操作失败。 inordertraverse(

5、t, print() ) 初始条件:二叉树t存在,print是二叉树全部结点输出的应用函数。 操作结果:中序非递归遍历t,对每个结点调用函数print一次且仅一次。一 旦printf()失败,则操作失败。 inordertraverse_re(t,print() ) 初始条件:二叉树t在在,print是二叉树全部结点输出的应用函数。操作结果:中序递归遍历t,对每个结点调用函数print一次且仅一次。一旦 printf()失败,则操作失败。 preordertraverse(t,print() 初始条件:二叉树t存在,print是二叉树全部结点输出的应用函数。 操作结果:先序非递归遍历t,对每个

6、结点调用函数print一次且仅一次。一 旦print()失败,则操作失败。 levelorder(t) 初始条件:二叉树t在在。操作结果:分层遍历二叉树t,并输出。inorderthreading(thrt,t);初始条件:二叉树t在在。操作结果:中序遍历二叉树,并将其中序线索化。inordertraverse_thr( t, print);初始条件:二叉树t在在。操作结果:中序非递归遍历二叉线索树tinthreading(p);初始条件:结点p在在。操作结果:结点p及子树线索化。3.主程序的流程:void main()初始化;提示;执行二叉数adt函数;4.本程序包含三个模块1) 主程序模块

7、void main()初始化;接受命令;显示结果;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);

8、/创建二叉树void preordertraverse_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(telemtyp

9、e e);/打印元素void initstack(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)

10、(telemtype e);void inthreading(bithrtree p);3.二叉树链表数据结构:typedef struct bitnodetelemtype 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;elseif(!(t=(bitnode *)malloc(si

11、zeof(bitnode)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);r

12、eturn ;elsereturn ;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-rchild);return;d

13、)中序递归遍历二叉树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(bithrnode);thrt-lt

14、ag=link;/建头结点thrt-rtag=thread;thrt-rchild=thrt;/右指针回指if(!t)thrt-lchild=thrt;elsethrt-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-lchild); / 左子树线索化 if (!p-lchi

15、ld) / 建前驱线索 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-lchild;while(p!=t)while(p-ltag=

16、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 structselemtype *base;selemtype *top;int stacksize;sqstack;基本操作:a)创建一个空栈void initstack(sqstack &s)s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype);

17、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;*s.top+=e;c)栈顶删除元素void pop(sqstack &s,s

18、elemtype &e)if(s.top=s.base)return;e=*-s.top;return;d)判断栈是否为空栈int stackempty(sqstack s)if(s.top=s.base)return ok;elsereturn error;e)e返回s的栈顶元素int gettop(sqstack s,selemtype &e)if(s.top=s.base)return error;e=*(s.top-1);return ok;5.主函数void main()int flag;bitree t;bithrtree thrt;printf(*n);printf(* 实验12

19、 二叉树的遍历 *n);printf(* 1. 实现二叉树的不同遍历算法和二叉树的中序线索化算法 *n);printf(* a) 中序递归遍历算法; *n);printf(* b) 先序递归遍历算法; *n);printf(* c) 中序遍历的非递归算法; *n);printf(* d) 先序或后序遍历非递归算法之一; *n);printf(* e) 建立中序线利用线索进行中序遍历和反中序遍历。 *n);printf(* 2. 实现二叉树的按层遍历算法。 *n);printf(*n);printf(n选择操作:nt1.先序与中序遍历算法nt2.中序线索的中序遍历和反中序遍历算法nt3.按层遍历

20、算法n请选择:);scanf(%d,&flag);switch(flag) case 1:printf(前序递归创建二叉树(空格 表示此结点为空):n);getchar();createbitree(t);printf(中序递归遍历输出:);inordertraverse_re(t,print);printf(n前序递归遍历输出:);preordertraverse_re(t,print);printf(n中序非递归遍历输出:);inordertraverse(t,print);printf(n前序非递归遍历输出:);preordertraverse(t,print); printf(n);b

21、reak;case 2:printf(前序递归创建二叉树(空格 表示此结点为空):n);getchar();createbitree(t);printf(n中序遍历线索化二叉树:);inorderthreading(thrt , t);inordertraverse_thr(thrt , print);break;case 3: printf(前序递归创建二叉树(空格 表示此结点为空):n);getchar();createbitree(t);printf(n按层遍历输出:);levelorder(t);printf(n);break;default:return;6. 函数间调用关系main

22、inordertraverse_recreatebitreepreordertraverse_reinordertraversepreordertraverseinorderthreadinginordertraverse_thrthreadingstack操作调试分析1、二叉树的分层遍历,开始时想用队列来做,但考虑到比较麻烦,因而改为数组模拟队列,简单易懂,课后可自行尝试用队列来做。2 在线索化二叉树时考虑到如果将两种存储结构分开将导致两个类型的指针不能互相传值,造成许多麻烦。比较两种存储结构发现,线索二叉树比二叉树多了两个标志域ltag,rtag。于是把两种存储结构合并为bithrnode

23、,并在建立二叉树时把ltag,rtag均置为link。程序正常运行。 3.进入演示程序bitree.cpp,完成编译,连接(即按下ctrl f5)进入演示界面,或直接打开执行文件bitree.exe,产生如下图所示的界面:1 用户需根据用户提示信息操作,输入二叉树(以空格表示空结点),输入完成后按回车键,屏幕上打印出对应于该二叉树的各种遍历结果。如下图:6、 测试结果输入:-+a *b -c d -e f 屏幕输出:中序递归遍历输出:a+b*c-d前序递归遍历输出:+a*b-cd中序非递归遍历输出:a+b*c-d前序非递归遍历输出:+a*b-cd按层遍历输出:+a*b-cd中序遍历线索化二叉树

24、:a+b*c-d7、 附录bitree.cppbitree.exe#include#include#define qelemtype bitnode#define telemtype char#define ok 1#define overflow 0#define error 0#define stack_init_size 100#define stackincrement 10typedef enum pointertaglink,thread;/link=0,指针,thread=1,线索typedef struct bitnodetelemtype data;struct bitnod

25、e *lchild ,*rchild;pointertag ltag , rtag;bitnode , *bitree , bithrnode , *bithrtree;/二叉树 #define qelemtype bitnode#define selemtype bitreetypedef structselemtype *base;selemtype *top;int stacksize;sqstack;/全局变量sqstack s;bithrtree pre;bithrtree i;/*函数声明*/ int createbitree(bitree &t);/创建二叉树void preor

26、dertraverse_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 i

27、nitstack(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);vo

28、id inthreading(bithrtree p);/*二叉树的创建递归创建*/int createbitree(bitree &t)char ch;scanf(%c,&ch);if(ch= )t=null;elseif(!(t=(bitnode *)malloc(sizeof(bitnode)return error;t-data=ch;if (createbitree(t-lchild) t-ltag=link;if (createbitree(t-rchild) t-rtag=link;return ok; /*/ /* 先序递归遍历输出 */ /*/void preordertra

29、verse_re(bitree t,int (*print)(telemtype e)if(t)if(print(t-data) preordertraverse_re(t-lchild,print);preordertraverse_re(t-rchild,print);return ;elsereturn ; /*/ /* 中序非递归遍历输出 */ /*/void inordertraverse(bitree t,int (*print)(telemtype e)sqstack s;s.base=null;s.top=null;selemtype p=null;initstack(s);p

30、ush(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-rchild);return; /*/ /* 中序递归遍历输出 */ /*/void inordertraverse_re(bitree t,int (*print)(telemtype e) if(t) inordertraverse_re(t-lchild,print); print(t-data); inordertraverse_re(t-r

31、child,print); return ; /*/ /* 按照前序非递归遍历二叉树:栈 */ /*/ void preordertraverse(bitree t,int (*print)(telemtype e) sqstack s;s.base=null;s.top=null;selemtype p=t;/p指向当前访问的结点 initstack(s); while(p|!stackempty(s) if(p) print(p-data); push(s,p); p=p-lchild; else pop(s,p); p=p-rchild; return; void inorderthre

32、ading(bithrtree &thrt,bithrtree t)/中序遍历二叉树t,并将其中序线索化,thrt指向头结点thrt=(bithrtree)malloc(sizeof(bithrnode);thrt-ltag=link;/建头结点thrt-rtag=thread;thrt-rchild=thrt;/右指针回指if(!t)thrt-lchild=thrt;elsethrt-lchild=t;pre=thrt;inthreading(t);/中序遍历进行中序线索化pre-rchild=thrt;pre-rtag=thread;/最后一个结点线索化thrt-rchild=pre;i=

33、thrt;/inorderthreadingvoid inthreading(bithrtree p) if (p) inthreading(p-lchild); / 左子树线索化 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); / 右子树线索化 / inthreadingint inordertraverse_thr(b

34、ithrtree t, int (*print)(telemtype e)/中序遍历线索化后的二叉树bithrtree p=null;p=t-lchild;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;/*以下为辅助函数*/int print(telemtype e)printf(%c,e);return ok;/*栈函数*/*栈的初始化*/v

35、oid initstack(sqstack &s)s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype);s.top=s.base;/初始为空s.stacksize=stack_init_size;return;/*栈顶插入元素*/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

36、=s.base+s.stacksize;s.stacksize+=stackincrement;*s.top+=e;/*栈顶删除元素*/void pop(sqstack &s,selemtype &e)if(s.top=s.base)return;e=*-s.top;return;int stackempty(sqstack s)/*若栈为空栈,则返回ok,否则返回error*/if(s.top=s.base)return ok;elsereturn error;int gettop(sqstack s,selemtype &e)if(s.top=s.base)return error;e=*

37、(s.top-1);return ok; /*/ /* 按层次顺序建立一棵二叉树 */ /*/ void levelorder(bitree t) int i,j; bitnode *q20,*p; /*q20用于模拟队列,存储入队的结点*/ p=t; if(p!=null) i=1;qi=p;j=2; /*i为队首位置,j为队尾位置*/ while(i!=j) p=qi; printf(%c,p-data); /*访问队首元素*/ if (p-lchild!=null) qj=p-lchild; j+; /*若队首元素左链域不为空,则将其入队列*/ if (p-rchild!=null) qj=p-rchild; j+; /*若队首元素右链域不为空,则将其入队列*/ i+; /*将队首移到下一个位置*/ void main()int flag;bitree t;bithrtree thrt;printf(*n);printf(* 实验12 二叉树的遍历 *n);printf(* 1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论