




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线索化二叉树遍历实验报告09040502班学号:052415朱博凯一、 需求分析(1) 本程序需要用户自行输入二叉树(二叉树的数据可以是任何字符),用”#”表示空格,按回车键结束!(2) 程序功能:遍历二叉树,线索化二叉树,遍历线索化二叉树,二叉树去线索化。(3) 测试数据:ABC#DE#G#F#;二、 概要设计为实现本程序功能,应以二叉树结构存储二叉树,而为了实现非递归遍历二叉树的功能,应以带头节点的栈存储二叉树。1、 二叉树的抽象数据类型定义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,ROOT,X1H,且存在D1上的关系H1H;如Dr,则Dr中存在唯一的元素xr,ROOT,XrH,且存在Dr上的关系Hr包含于H;H=ROOT,X1,ROOT,Xr,H1,Hr;(4) (D1,H1)是一棵符合本定义的二叉树,称为根的右子树。基本操作 P:InitBiTree(&T);操作结果:构造空二叉树T.DestroyBiTree(&T);初始条件:二叉树T存在。操作结果:销毁二叉树T.CreateBiThrTree(&T);操作结果:先序构造二叉树T,Ltag和RTag初始置为Link.PreOrderTraverse(T );初始条件:二叉树T存在。操作结果:先序递归遍历T。InOrderTraverse(T);初始条件:二叉树T存在。操作结果:中序递归遍历T。PostOrderTraverse(T);初始条件:二叉树T存在。操作结果:后序递归遍历T。InOrderThreading(&ThrT, T);初始条件:二叉树T存在。操作结果:建立头结点ThrT,并调用InThreading(T);函数。InThreading(T);初始条件:二叉树T存在。操作结果:中序线索化二叉树T;InOrderTrasverse_Thr(T);初始条件:二叉树T存在。操作结果:中序扫描线索化的二叉树。ADT BinaryTree2、 栈的抽象数据类型定义ADT Stack数据对象:d= ai |aielemset,i=1,2,3,,n,n0数据关系:r=| ai-1,ai d, i=2,3,,n约定a1为栈底,an 为栈顶。基本操作:(1)InitStack(&S)操作结果:构造一个空栈S。(2)DestroyStack(&S)初始条件:栈S已存在。操作结果:销毁栈S。(3)ClearStack(&S)初始条件:栈S已存在。操作结果:将栈清空为空栈。(4)StackEmpty(&S)初始条件:栈S已存在。操作结果:若栈S为空栈,则返回TRUE,否则FALSE。 (5)StackLength(&S)初始条件:栈S已存在。操作结果:返回栈的长度(或者说深度)。(6)GetTop(S,&e)初始条件:栈S已存在且非空。操作结果:用e返回S的栈顶元素。(7)Push(&S,e)初始条件:栈S已存在。 操作结果:在栈顶插入新的元素e。(8)Pop(&S,&e)初始条件:栈S已存在且非空。 操作结果:删除栈S的栈顶元素,并且用e返回它的值。(9)StackTraverse(S,visit()初始条件:栈S已存在。操作结果:遍历访问栈,一次对S的每个元素调用函ADT Stack3、 程序包括6个模块1) 主程序模块:2) 创建二叉树;3) 计算树的高度;4) 递归遍历二叉树(先、中、后序);5) 非递归遍历二叉树(先、中序);6) 线索化二叉树(先、中序);7) 二叉树去线索化;三、 详细设计1、 元素类型、结点类型typedef struct BiTNodeTElemType data;struct BiTNode *lchild ,*rchild;PointerTag LTag , RTag;BiTNode , *BiTree , BiThrNode , *BiThrTree;/二叉树typedef structBiTree *base;BiTree *top;int stacksize;SqStack;/栈2、 栈的实现typedef structchar *base;char *top;int stacksize;SqStack;/栈类型栈的基本操作设置如下:void InitStack(Stack &S)/初始化,设S为空栈(S.top=NULL)void DestroyStack(Stack &S)/销毁栈S,并释放所占空间void ClearStack(Stack &S)/将S清为空栈int StackLength(Stack S)/返回栈S的长度S.sizeStatus StackEmpty(Stack S)/若S为空栈(S.top=NULL),则返回TRUE;否则返回FALSEStatus GetTop(Stack S,ElemType e)/若栈S不空,则以e带回栈顶元素并返回TRUE,否则返回FALSEStatus Push(Stack&S,ElemType e)/若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回TRUE,/否则返回FALSEvoid StackTraverse(Stack S,Status (*visit)(ElemType e)/从栈底到栈顶依次对S中的每个结点调用函数visit3、 主函数和其他函数的伪码typedef int status;typedef char TElemType;typedef enum PointerTagLink,Thread;/二叉树的操作status CreatBiTree(BiTree &T);status treedepth(BiTree T);status Visit(TElemType e);status PreOrderTraverse(BiTree T,status(*Visit)(TElemType e);status InOrderTraverse(BiTree T,status(*Visit)(TElemType e);status PostOrderTraverse(BiTree T,status(*Visit)(TElemType e);status UnInOrderTraverse(BiTree T,status(*Visit)(TElemType e);/非递归中序遍历status UnPreOrderTraverse(BiTree T,status(*Visit)(TElemType e);/非递归先序遍历/线索化二叉树的操作void InOrderThreading(BiThrTree &Thrt,BiThrTree T);void InThreading(BiThrTree p);status InOrderTraverse_Thr(BiThrTree T, status (*Visit)(TElemType e);void PreOrderThreading(BiThrTree &Thrt,BiThrTree T);status PreOrderTraverse_Thr(BiThrTree T, status (*Visit)(TElemType e);void PreThreading(BiThrTree p);void UnThreading(BiThrTree &Thrt);/栈的操作status InitStack(SqStack &S);status GetTop(SqStack S , BiTree &e);status Push(SqStack &S , BiTree e);status Pop(SqStack &S , BiTree &e);status StackEmpty(SqStack S);/全局变量SqStack S;BiThrTree pre;BiThrTree i;void main()/主函数printf(t*nt*二叉树演示*nt*n);BiTree T;BiThrTree Thrt;printf(n创建二叉树(用#表示空格):n);CreatBiTree(T);printf(树的高度为:%d,treedepth(T);printf(n递归先序遍历:);PreOrderTraverse(T , Visit);printf(n递归中序遍历:);InOrderTraverse(T , Visit);printf(n递归后序遍历:);PostOrderTraverse(T , Visit);printf(n非递归中序遍历:);UnInOrderTraverse(T , Visit);printf(n非递归先序遍历:);UnPreOrderTraverse(T , Visit);printf(n中序遍历线索化二叉树:);InOrderThreading(Thrt , T);InOrderTraverse_Thr(Thrt , Visit);printf(n后序递归去线索化并输出:);UnThreading(Thrt);printf(n先序遍历线索化二叉树:);PreOrderThreading(Thrt , T);printf(n);status CreatBiTree(BiTree &T)/创建二叉树char ch;ch=getchar();if(ch=#)T=NULL;elseif(!(T=(BiTNode *)malloc(sizeof(BiTNode)return ERROR;T-data=ch;if (CreatBiTree(T-lchild) T-LTag=Link;if (CreatBiTree(T-rchild) T-RTag=Link;return OK;status treedepth(BiTree T)/计算树的高度int lchilddep,rchilddep;if(T=NULL)return 0;elselchilddep=treedepth(T-lchild);rchilddep=treedepth(T-rchild);if(lchilddeprchilddep)return lchilddep+1;elsereturn rchilddep+1;status Visit(TElemType e)printf(%c,e);return OK;status PreOrderTraverse(BiTree T,status(*Visit)(TElemType e)/递归先序遍历if(T)if(Visit(T-data)if(PreOrderTraverse(T-lchild,Visit)if(PreOrderTraverse(T-rchild,Visit)return OK;return ERROR;elsereturn OK;/PreOrderTraversestatus InOrderTraverse(BiTree T,status(*Visit)(TElemType e)/递归中序遍历if(T)if(InOrderTraverse(T-lchild,Visit)if(Visit(T-data)if(InOrderTraverse(T-rchild,Visit)return OK;return ERROR;else return OK;/InOrderTraversestatus PostOrderTraverse(BiTree T,status(*Visit)(TElemType e)/递归后序遍历if(T)if(PostOrderTraverse(T-lchild,Visit)if(PostOrderTraverse(T-rchild,Visit)if(Visit(T-data)return OK;return ERROR;else return OK;/PostOrderTraversestatus UnInOrderTraverse(BiTree T,status(*Visit)(TElemType e)/非递归中序遍历BiTree p;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);if(!Visit(p-data)return ERROR;Push(S,p-rchild);/if/whilereturn OK;/UnInOrderTraversestatus UnPreOrderTraverse(BiTree T,status(*Visit)(TElemType e)/非递归先序遍历BiTree p;InitStack(S);p=T;while(p|!StackEmpty(S)if(p)if(!Visit(p-data)return ERROR;Push(S,p);p=p-lchild;elsePop(S,p);p=p-rchild;/else/whilereturn OK;/UnPreOrderTraversevoid InOrderThreading(BiThrTree &Thrt,BiThrTree T)/中序遍厉二叉树T,并将其中序线索化,Thrt指向头结点if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode) exit(OVERFLOW);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=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;InThreading(p-rchild);/InThreadingvoid UnThreading(BiThrTree &Thrt) /后序去线索化BiThrTree p=Thrt;if(p)if(p-LTag = Thread)p-lchild = NULL;p-LTag = Link;if(p-LTag = Link & p-lchild) UnThreading(p-lchild);if(p-RTag = Link & p-rchild)UnThreading(p-rchild);if(p != i) Visit(p-data);status InOrderTraverse_Thr(BiThrTree T, status (*Visit)(TElemType e)/中序遍历线索化后的二叉树BiThrTree p;p=T-lchild;while(p!=T)while(p-LTag=Link)p=p-lchild;if(!Visit(p-data)return ERROR;while(p-RTag=Thread & p-rchild!=T)p=p-rchild;Visit(p-data);p=p-rchild;return OK;void PreOrderThreading(BiThrTree &Thrt,BiThrTree T)/先序遍厉二叉树T,并将其先序线索化,Thrt指向头结点if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode) exit(OVERFLOW);Thrt-LTag=Link;Thrt-RTag=Thread;/建头结点Thrt-rchild=Thrt;/右指针回指if(!T)Thrt-lchild=Thrt;elseThrt-lchild=T;pre=Thrt;PreThreading(T);/先序遍历进行先序线索化pre-rchild=Thrt;pre-RTag=Thread;/最后一个结点线索化Thrt-rchild=pre;i=Thrt;status PreOrderTraverse_Thr(BiThrTree T, status (*Visit)(TElemType e) /先序遍历线索化后的二叉树BiThrTree p;p=T-lchild;while(p!=T)while(p-LTag=Link)p=p-lchild;if(!Visit(p-data)return ERROR;while(p-RTag=Thread & p-rchild!=T)p=p-rchild; Visit(p-data);p=p-rchild;return OK;/PreOrderTraverse_Thrvoid PreThreading(BiThrTree p)/先序线索化if(p)if(!p-lchild)p-LTag = Thread;p-lchild = pre;if(!pre-rchild)pre-RTag = Thread;pre-rchild = p;pre = p;Visit(p-data);if(p-LTag=Link)PreThreading(p-lchild);if(p-RTag = Link)PreThreading(p-rchild);/PreThreadingstatus InitStack(SqStack &S)/栈的初始化S.base=(BiTree *)malloc(STACK_INIT_SIZE * sizeof(BiTree);if(!S.base)exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;status GetTop(SqStack S , BiTree &e)/取顶元素if(S.top = S.base) return ERROR;elsee = *(S.top-1);return OK;status Push(SqStack &S , BiTree e)/进栈if(S.top - S.base = S.stacksize)S.base = (BiTree *)realloc(S.base , (S.stacksize + STACKINCREMENT) * sizeof(BiTree);if(!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;*S.top+ = e;return OK;status Pop(SqStack &S , BiTree &e)/出栈if(S.top = S.base)return ERR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025黑龙江黑河市逊克县乡村医生公开招聘19人考前自测高频考点模拟试题及答案详解参考
- 2025内蒙古土地资源收储投资(集团)有限公司常态化招聘50名急需紧缺专业人员的(第十二批)考前自测高频考点模拟试题及一套参考答案详解
- 2025第五师医院招聘劳务派遣人员(2人)考前自测高频考点模拟试题及1套参考答案详解
- 2025年安庆桐城市安徽安桐城乡发展集团有限公司招聘17人模拟试卷及答案详解(考点梳理)
- 2025昆明辅仁技工学校教师招聘(55人)模拟试卷及参考答案详解一套
- 2025河南郑州市中华保险招聘考前自测高频考点模拟试题及答案详解(易错题)
- 2025年六安市中医院公开招聘13人模拟试卷及答案详解(全优)
- 2025广东依顿电子科技股份有限公司招聘HRBP岗人员模拟试卷及答案详解(新)
- 2025湖南长虹聚和源科技有限公司招聘工艺工程师岗位人员考前自测高频考点模拟试题及1套完整答案详解
- 2025年聊城科技职业学院(筹)公开招聘工作人员(60人)模拟试卷及参考答案详解1套
- 道字的演变课件
- GB 46039-2025混凝土外加剂安全技术规范
- 2025至2030年中国卡丁车俱乐部行业市场调研分析及投资战略咨询报告
- 教案2025秋形势与政策纪念抗战胜利坚定民族信念抗战胜利80周年
- 加油站职业健康危害因素分析
- 辽宁省沈阳市2025届高考语文模拟试卷(含答案)
- 公路统计管理办法
- 危重症患者的疼痛管理
- 电力建设安全规程2025新版
- 2024年法考真题及答案解析
- 2025年苏州市中考数学试卷真题(含答案解析)
评论
0/150
提交评论