二叉树抽象数据类型数据结构实验报告.doc_第1页
二叉树抽象数据类型数据结构实验报告.doc_第2页
二叉树抽象数据类型数据结构实验报告.doc_第3页
二叉树抽象数据类型数据结构实验报告.doc_第4页
二叉树抽象数据类型数据结构实验报告.doc_第5页
已阅读5页,还剩19页未读, 继续免费阅读

下载本文档

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

文档简介

数据结构实验报告题目:二叉树抽象数据类型的实现 学 院 *学院 专 业 * 年级班别 * 学 号 * 学生姓名 * 指导教师 成 绩 _2012年6月 报告:内容:详细完整不完整设计方案:非常合理合理较差实现:全部实现部分实现未实现文档格式:规范基本规范不规范答辩:理解题目透彻,问题回答流利理解题目较透彻,回答问题基本正确部分理解题目,部分问题回答正确未能完全理解题目,答辩情况较差总评成绩:优良中及格不及格一实验概要二叉树抽象数据类型的实现二.实验目的1. 了解二叉树的定义以及各项基本操作。2. 实现二叉树存储、遍历及其他基本功能三. 实验仪器设备和材料 Visual studio 2010四实验的内容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,H,且存在Dr上的关系HrH;H=,H1,Hr;(4) (D1,H1)是一棵符合本定义的二叉树,称为根的左子树,是一棵符合本定义的二叉树,称为根的右子树。基本操作P:InitBiTree(&T);操作结果:构造空二叉树T。DestroyBiTree(&T);初始条件:二叉树T存在。操作结果:销毁二叉树T。CreateBiTree(&T,definition);初始条件:definition给出二叉树T的定义。操作结果:按definition构造二叉树T。ClearBiTree(&T);初始条件:二叉树T存在。操作结果:将二叉树T清为空树。BiTreeEmpty(T);初始条件:二叉树T存在。操作结果:若T为空二叉树,则返回TURE,否则FALSE。BiTreeDepth(T);初始条件:二叉树T存在。操作结果:返回T的深度。Root(T);初始条件:二叉树T存在。操作结果:返回T的根。Value(T,e);初始条件:二叉树T存在,e是T中的某个结点。操作结果:返回e的值。Assign(T,&e,value); 初始条件:二叉树T存在,e是T中的某个结点。 操作结果:结点e赋值为value。Parent(T,e); 初始条件:二叉树T存在,e是T中的某个结点。操作结果:若e是T的非跟结点,则返回它的双亲,否则返回“空”。LeftChild(T,e);初始条件:二叉树T存在,e是T中的某个结点。操作结果:返回e的左孩子。若e无左孩子,则返回“空”。RightChild(T,e);初始条件:二叉树T存在,e是T中的某个结点。操作结果:返回e的右孩子。若e无右孩子,则返回“空”。LeftSibling(T,e);初始条件:二叉树T存在,e是T中的某个结点。操作结果:返回e的左兄弟。若e无左孩子或无左兄弟,则返回“空”。RightSibling(T,e); 初始条件:二叉树T存在,e是T中的某个结点。操作结果:返回e的右兄弟。若e无右孩子或无右兄弟,则返回“空”。ADT BinaryTree2.所选择的存储结构描述及在此存储结构上各基本操作的实现;3.源代码主文件:main.ccp:#includebase.h/ 公用头文件、公共常量及公共函数等#includebitree.h/ 二叉树二叉链表基本操作voidMenu();/ 菜单函数voidProduce(char *str);/ 随机产生二叉树先序序列函数intmain()/ 主函数BiTreeT,bt,insert_bt;charcmd,strMAXSIZE,elem;intloc,temp;InitBiTree(T);/ 初始化二叉链表二叉树Menu();/ 显示菜单while(1)ClearLine();/ 清空结果显示区printf(请选择操作:(按Q退出);cmd = getch();ClearLine();fflush(stdin);switch(cmd)case 0:/ 随机创建一棵二叉树while(cmd != y & cmd != Y)Produce(str);/ 随机产生二叉树先序序列CreateBiTree(T,str);/ 用此序列建树ShowBiTree(T);/ 广义表形式显示printf( 使用创建的这个二叉树?);cmd = getch();ClearLine();break;case 2:/ 手动创建一棵二叉树printf( 请按二叉树先序序列输入二叉树:(空结点用空格 表示)n );CreateBiTree(T);ClearLine();printf( 二叉树创建成功!n);ShowBiTree(T);getch();break;case 4:/ 销毁二叉树DestroyBiTree(T);printf( 二叉树已被销毁!);getch();break;case 6:/ 判空if(BiTreeEmpty(T) printf(二叉树是空二叉树。);elseprintf(二叉树非空);getch();break;case 8:/ 求深度printf(深度是 %d,BiTreeDepth(T);getch();break;case a:/ 求左孩子ShowBiTree(T);printf(你想求哪个字符的左孩子?);doelem = getchar();ClearLine();bt = SearchBiTree(T,elem);/ 查找指定的结点值elemif(!bt) printf( 你输入的结点不存在!请重新输入:);while(!bt);ClearLine();bt = LeftChild(T,bt);/ 求左孩子if(bt) printf( %c的左孩子是%c,elem,bt-data);elseprintf( %c没有左孩子,elem);printf(n参照二叉树:);ShowBiTree(T);getch();break;case c:/ 求右孩子ShowBiTree(T);printf( 你想求哪个字符的右孩子?);doelem = getchar();ClearLine();bt = SearchBiTree(T,elem);if(!bt) printf( 你输入的结点不存在!请重新输入:);while(!bt);ClearLine();bt = RightChild(T,bt);if(bt) printf( %c的右孩子是%c,elem,bt-data);elseprintf( %c没有右孩子,elem);printf(n参照二叉树:);ShowBiTree(T);getch();break;case 1:/ 先序遍历if(!BiTreeEmpty(T)printf(先序遍历序列为:);PreOrderTraverse(T,Visit);else printf(二叉树空,请先建树!);getch();break;case 3:/ 中序遍历if(!BiTreeEmpty(T)printf(中序遍历序列为:);InOrderTraverse(T,Visit);else printf(二叉树空,请先建树!);getch();break;case 5:/ 后序遍历if(!BiTreeEmpty(T)printf(后序遍历序列为:);PostOrderTraverse(T,Visit);else printf( 二叉树空,请先建树!);getch();break;case 7:/ 层次遍历if(!BiTreeEmpty(T)printf(层次遍历序列为:);LevelOrderTraverse(T,Visit);else printf(二叉树空,请先建树!);getch();break;case 9:/ 插入一棵二叉树为另一棵二叉树的子树do/ 随机创建一棵右孩子为空Produce(str);/ 且层数小于4的树CreateBiTree(insert_bt,str);while(insert_bt-rchild|BiTreeDepth(insert_bt) 3);printf( 先随机创建一棵右子树空的二叉树如图n);ShowBiTree(insert_bt);/ 新创建的树getch();printf( 你想插入这棵树为原树哪个结点的子树 :n);ShowBiTree(T);bt = SearchBiTree(T,getchar();ClearLine();printf( 你想插入为 0. 左孩子 1. 右孩子 :);fflush(stdin);scanf(%d,&loc);if(!InsertChild(T, bt, loc, insert_bt)printf( 插入出错!);elseClearLine();printf( 插入成功!插入后T广义表形式为:n);ShowBiTree(T);getch();break;case b:/ 删除指定结点的子树ShowBiTree(T);printf( 你想删除哪个结点的子树?);fflush(stdin);bt = SearchBiTree(T,getchar();printf(n你想删除 0.左子树 1.右子树: );fflush(stdin);scanf(%d,&loc);ClearLine();if(!DeleteChild(T,bt,loc) printf( 删除出错!);else printf( 删除成功,检查结果n);ShowBiTree(T);getch();break;case e:/ 返回先序序列第i个结点的值printf(请输入一个结点的先序序列序号: );scanf(%d,&loc);temp = loc;ClearLine();elem = Value(T,temp);printf(参照二叉树:);ShowBiTree(T);printf(n);if(elem = )printf( 该结点不存在。);else printf( 先序序列第%d个结点值为%c,loc,elem);getch();break;case d:/ 结点赋值ShowBiTree(T);printf( 请输入要赋值的结点: );doelem = getchar();ClearLine();bt = SearchBiTree(T,elem);if(!bt) printf( 你输入的结点不存在!请重新输入:);while(!bt);ClearLine();printf( 请输入新值: );fflush(stdin);elem = getchar();Assign(T,bt,elem);printf( 赋值成功,请查看二叉树状态.n);ShowBiTree(T);getch();break;case Q:/ 退出case q: exit(0);return 0;voidMenu()/ 显示菜单函数printf( 0. 随机创建 CreateBiTree() 1. 先序遍历 PreOrderTraverse();printf(nn 2. 手动创建 CreateBiTree() 3. 中序遍历 InOrderTraverse();printf(nn 4. 销毁 DestoryBiTree() 5. 后序遍历 PostOrderTraverse();printf(nn 6. 判空 BiTreeEmpty() 7. 层次遍历 LevelOrderTraverse();printf(nn 8. 求深度 BiTreeDepth() 9. 插入子树 InsertChild();printf(nn a. 求左孩子 LeftChild() b. 删除子树 DeleteChild();printf(nn c. 求右孩子 RightChild() d. 结点赋值 Assign();printf(nn e. 求结点值 Value();printf(nn);voidProduce(char *str)/ 用随机数产生二叉树层次字符序列/ 使所有节点的字符不相同,空节点用&表示intexist27 , i , elem, maxnodes = rand()%41;while( maxnodes 31) maxnodes = rand()%41; /* 随机产生一个 大于15小于31的随机数作为结点个数 */for(i = 0; i 27 ;i+) existi = 0;/ 初始化存在数组,用于使所有结点值不同i = 1;while(i maxnodes)elem = rand() % 26 ;if(!existelem & stri/2 != &) / 结点未生成且存在父节点stri+ = elem + A;existelem = 1;else stri+ = &;stri = 0;头文件:base.h:#includestdio.h#includeconio.h#includestdlib.h#includewindows.h#includemalloc.h#includemath.h#define OK 1#define TRUE1#defineERROR0#defineFALSE0#defineMAXSIZE100typedefintStatus;typedefcharTElemType;shortwherex()/返回光标的x坐标CONSOLE_SCREEN_BUFFER_INFO csbinfo;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbinfo); return csbinfo.dwCursorPosition.X;shortwherey()/返回光标的y坐标CONSOLE_SCREEN_BUFFER_INFO csbinfo;GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbinfo); return csbinfo.dwCursorPosition.Y;void gotoxy(short x,short y)/移动光标到(x,y)坐标COORD point = x, y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point);void ClearLine(unsigned y = 17)/清除第y行与y+1行的字符,并使光标在行首,默认清除第17至19行for(int i = 0;i 256;i+) gotoxy(i,y);putchar( );gotoxy(0,wherey()-3);void ClearAera(unsigned x = 96, unsigned y = 17)/清除(0,y)-(x,y+1)区域的字符,并使光标移动到yfor(unsigned i = 0; ilchild);/ 删除左子树DestroyBiTree(T-rchild);/ 删除右子树free(T);T = NULL;return OK;StatusCreateBiTree(BiTree &T)/ 先序建立二叉树T,空格表示空结点TElemType ch;fflush(stdin);ch=getche();if(ch = ) T = NULL;elseT = (BiTree)malloc(sizeof(BiTNode);if(!T) exit(OVERFLOW);T-data = ch;/ 生成头结点CreateBiTree(T-lchild);/ 构造左子树CreateBiTree(T-rchild);/ 构造右子树return OK;StatusCreateBiTree(BiTree &T,char *str,unsigned i = 1)/ str储存着二叉树的层次序列,stri=&表示结点不存在/ i为当前要创建结点对应的数组序号节点/ 由字符数组str先序建立一棵二叉树Tif(stri = & | i = strlen(str) T = NULL;/ 第i个结点不存在elseT = (BiTree)malloc(sizeof(BiTNode);if(!T) exit(OVERFLOW);T-data = stri;/ 生成根节点CreateBiTree(T-lchild, str, i*2);/ 构造左子树CreateBiTree(T-rchild, str, i*2+1);/ 构造右子树return OK;StatusBiTreeEmpty(BiTree T)/ 若T为空二叉树,则返回TRUE,否则返回FALSEif(!T)return TRUE;elsereturn FALSE;intBiTreeDepth(BiTree T)/ 返回T的深度/利用层次遍历求深度if(!T) return 0;BiTreequeue200;int dep =0;intrear = 0 ,front = 0;queuerear+ = T;while(rear != front)T = queuefront+; if(T-data)dep+;if(T-lchild) queuerear+ = T-lchild;if(T-rchild) queuerear+ = T-rchild;else dep-;return dep;TElemTypeValue(BiTree T,int&k)/ 返回二叉树先序遍历第k个节点的值,不存在则返回空格 if(!T | k data;BiTree stack100,p = T;/ 定义数组栈inttop = 0 ,i=-1;/ 初始化栈顶指针while(p | top 0 )/ 当结点不空或栈不空if(p) i+;if(i=k)return p-data;stacktop+ = p;/ 根指针入栈,遍历左子树p = p-lchild; else/ 根指针退栈,遍历右子树p = stack-top;p = p-rchild;voidAssign(BiTree T,BiTree &p,TElemType value)/ 二叉树T存在,e是T中某个结点/ 结点p赋值为value if(p) p-data = value;BiTreeLeftChild(BiTree T,BiTree p)/ 返回p的左孩子。若p无左孩子,则返回“空”return p-lchild;BiTreeRightChild(BiTree T,BiTree p)/ 返回p的右孩子。若p无右孩子,则返回“空”return p-rchild;StatusInsertChild(BiTree &T,BiTree &p,int LR,BiTree &c)/ 二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空。/ 根据LR为0或1,插入c为T中p所指向结点的左或右子树。/ p所指结点的原有左或右子树则成为c的右子树。if( !T | !c | !p | (LR != 0 & LR != 1)return ERROR;/ 不符合条件if(LR =0 )/ 插入为左子树c-rchild = p-lchild;p-lchild = c;if(LR = 1)/ 插入为右子树c-rchild = p-rchild;p-rchild = c;return OK;StatusDeleteChild(BiTree &T,BiTree &p,intLR)/ p指向T中某个结点,LR为0或1./ 用队列,根据LR为0或1,删除T中P所指结点的左或右子树if(!T | !p | (LR != 1 & LR != 0) return ERROR;BiTreequeue200;/ 定义数组队列intrear = 0, front = 0 ;/ 初始化队列的头指针和尾指针if(LR = 0 & p-lchild)/ LR为0且所删除左孩子存在queuerear+ = p-lchild;/ 则左孩子入队p-lchild = NULL;if(LR = 1 & p-rchild)/ LR为1且所删除右孩子存在queuerear+ = p-rchild;/ 则右孩子入队p-rchild = NULL;while(rear != front)/ 用队列层次遍历,删除所要求的子树p = queuefront+;if(p-lchild) queuerear+ = p-lchild;if(p-rchild) queuerear+ = p-rchild;free(p);return OK;StatusPreOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/ 非递归先序遍历二叉树。对每个节点调用Visit函数 BiTree stack100,p = T;/ 定义数组栈inttop = 0 ;/ 初始化栈顶指针while(p | top 0 )/ 当结点不空或栈不空if(p)if(!Visit(p-data)/ 访问根节点return ERROR;stacktop+ = p;/ 根指针入栈,遍历左子树p = p-lchild;else/ 根指针退栈,遍历右子树p = stack-top;p = p-rchild;return OK;StatusInOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/ 非递归中序遍历二叉树,对每个节点调用Visit。BiTree stack100,p = T;/ 定义数组栈inttop = 0 ;/ 初始化栈顶指针while(p | top 0 )if(p)/ 根指针入栈,遍历左子树stacktop+ = p;p = p-lchild;else/ 根指针退栈,遍历右子树p = stack-top;if(!Visit(p-data) return ERROR;p = p-rchild;return OK;StatusPostOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/ 用栈非递归后序遍历二叉树T。/ 与非递归先序中序的区别在于,多定义一visited数组,用来记录访问次数/ 第二次访问时才退栈。BiTreestack100 , p = T;/ 定义数组栈inttop = 0, visited100;/ 初始化栈顶指针与访问次数数组while(p | top 0)if(p)/ 遍历左子树,置访问数组为第一次访问stacktop+ = p;visitedtop-1 = 0;p = p-lchild;elseif(visitedtop-1 = 0)/ 若栈顶结点只访问一次,遍历右子树p = stacktop-1;visitedtop-1 +;p = p-rchild;else if(visitedtop-1 = 1)/ 若第二次访问,则根指针退栈,访问根节点。if(!Visit(stack-top-data) return ERROR;return OK;StatusLevelOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/ 用队列层次遍历二叉树T。/ 对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败if(!T)return OK;BiTreequeue200;

温馨提示

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

最新文档

评论

0/150

提交评论