《二叉树基本操作实验报告》.doc
《《二叉树基本操作实验报告》.doc》由会员分享,可在线阅读,更多相关《《二叉树基本操作实验报告》.doc(27页珍藏版)》请在咨信网上搜索。
1、数据结构与数据库实验报告实验题目二叉树的基本操作及运算学院:化学与材料科学学院专业班级:09级材料科学与工程系 PB0920603姓名:李维谷学号:PB09206285 邮箱:liwg指导教师:贾伯琪实验时间:2010年10月17日一、 需要分析问题描述:实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。问题分析:二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也
2、可采用递归调用的方法。处理本问题,我觉得应该:1、 建立二叉树;2、 通过递归方法来遍历(先序、中序和后序)二叉树;3、 通过队列应用来实现对二叉树的层次遍历;4、 借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等;5、 运用广义表对二叉树进行广义表形式的打印。算法规定:输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。对二叉树的一些运算结果以整型输出。程序功能:实现对二叉树的先序、中序和后序
3、遍历,层次遍历。计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。测试数据:输 入 一:ABCDEGF (以表示空格),查找5,删除E 预测结果:先序遍历 ABCDEGF 中序遍历 CBEGDFA 后序遍历 CGEFDBA 层次遍历 ABCDEFG 广义表打印 A(B(C,D(E(,G),F) 叶子数 3 深度 5 宽度 2 非空子孙数 6 度为2的数目 2 度为1的数目2 查找5,成功,查找的元素为E删除E后,以广义表形式打印A(B(C,D(,F) 输 入 二:ABDEHCFG (以表示空格
4、),查找10,删除B 预测结果:先序遍历 ABDEHCFG 中序遍历 DBHEAGFC 后序遍历 DHEBGFCA 层次遍历 ABCDEFHG 广义表打印 A(B(D,E(H),C(F(,G)) 叶子数 3 深度 4 宽度 3 非空子孙数 7 度为2的数目 2 度为1的数目3 查找10,失败。删除B后,以广义表形式打印A(,C(F(,G)二、 概要设计程序中将涉及下列两个抽象数据类型:一个是二叉树,一个是队列。1、设定“二叉树”的抽象数据类型定义:ADT BiTree数据对象D:D是具有相同特性的数据元素的集合。数据关系R: 若,则,称BiTree为空二叉树; 若,则,H是如下二元关系:(1)
5、 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2) 若则存在且;(3) 若则中存在唯一的元素,且存在上的关系若则中存在唯一的元素,且存在上的关系;(4) 是一棵符合本定义的二叉树,称为根的左子树,是一棵符合本定义的二叉树,称为根的有字树基本操作: CreateBiTree&T) 操作结果:按照T的定义构造一个二叉树。 BiTreeDepth(& T) 初始条件:二叉树T已存在。 操作结果:返回T的深度。BiTreeWidth(&T)初始条件:二叉树T已存在。 操作结果:返回T的宽度。PreOderTraverse&T) 初始条件:二叉树T已存在。 操作结果:先序遍历打印T,
6、InOderTraverse(&T)初始条件:二叉树T已存在。 操作结果:中序遍历打印T。PostOderTraverse(&T)初始条件:二叉树T已存在。 操作结果:后序遍历打印T。LevelTraverse(&T)初始条件:二叉树T已存在。 操作结果:层次遍历T。DeleteXTree(&T,TElemType x)初始条件:二叉树已存在。 操作结果:删除元素为x的结点以及其左子树和右子树。 CopyTree(&T)初始条件:二叉树T已存在。 操作结果:以T为模板,复制另一个二叉树。ADT BiTree2、设定队列的抽象数据类型定义:ADT Queue数据对象:D=数据关系:R1=|,i=
7、2,,n约定端为队列头,端为队列尾。基本操作: InitQueue(&Q) 操作结果:构造一个空队列Q。 EnQueue(&Q,&e) 初始条件:队列Q已存在。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue(&Q) 初始条件:队列Q已存在。 操作结果:删除Q的对头元素,并返回其值。 QueueEmpty(&Q) 初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回1,否则0。 ADT Queue3、本程序包含四个模块1)主程序模块void main( )初始化;先序输入二叉树各结点元素;各种遍历二叉树;对二叉树进行常见运算;复制二叉树;在复制的二叉树上进行二叉树的常见操作;2)
8、二叉树模块实现二叉树的抽象数据类型和基本操作2)队列模块实现队列的抽象数据类型及今本操作3)广义表打印模块以广义表形式打印二叉树4)二叉树运算模块对二叉树的叶子、非空子孙结点数目、度为2或1的结点数三、 详细设计1、主程序中需要的全程量#define M 10 / 统计二叉树宽度时需用数组对每层宽度进行存储,这M表示数组的长度2、队列的建立与基本操作typedef struct QNodeBiTree data; /队列中存储的元素类型struct QNode *next; /指向二叉树结点的指针 QNode,*Queueptr;typedef structQueueptr front; /队
9、列的队头指针Queueptr rear; /队列的队尾指针LinkQueue;算法描述:为了对二叉树进行层次遍历,需要“先访问的结点,其孩子结点必然也先访问”,故需运用到队列。而考虑到层次遍历对队列操作的需要,只需进行队列的初始化,入队和出队以及检查队列是否为空。伪码算法:void InitQueue(LinkQueue *Q)/初始化队列申请一个结点Q-front=Q-rear=(Queueptr)malloc(sizeof(QNode);if(!Q-front)exit(1);/存储分配失败处理Q-front-next=NULL;/构成带头结点里的空链队列void EnQueue(Link
10、Queue *Q,BiTree e)/插入元素为e为Q的队尾元素Queueptr q;q=(Queueptr)malloc(sizeof(QNode);if(!q)exit(1);q-data=e;q-next=NULL;Q-rear-next=q; /元素e的结点入列Q-rear=q;BiTree DeQueue(LinkQueue *Q)/从队列中删除队头元素,并直接返回给调用的主函数Queueptr p;BiTree q;if(Q-front=Q-rear)/队列为空printf(ERROR!n);exit(1);p=Q-front-next;q=p-data;Q-front-next=
11、p-next; /删除该结点if(Q-rear=p)Q-rear=Q-front;free(p);return q;/返回队头元素int QueueEmpty(LinkQueue *Q)/检查队列是否为空,若为空则返回真值,否则返回0if(Q-front=Q-rear)return 1;elsereturn 0;3、二叉树的建立与基本操作typedef struct BiTNodeTElemType data; /二叉树结点存储的元素类型struct BiTNode *lchild,*rchild; /二叉树左右孩子指针BiTNode,*BiTree;算法分析:二叉树的基本操作是本程序的核心,
12、考虑到二叉树的定义就是采用递归定义,所以很容易想到对二叉树的操作可通过递归调用来实现。1)二叉树的遍历算法描述:二叉树中常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理,这就需要遍历二叉树。即要求按某条路径寻访树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。回顾二叉树的递归定义可知,二叉树是由3个基本单元组成:根节点、左子树和右子树。因此,若能依次遍历这三部分,便是遍历了整棵二叉树。如果以L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则可有DLR、LDR、LRD、DRL、RDL、RLD这6种遍历二叉树的方案。若限定先右后左,则只有前三种情况,分别称之
13、为先(根)序遍历。中(根)序遍历和后(根)序遍历。基于二叉树的递归定义,可得下述遍历二叉树的递归定义算法。先序遍历二叉树的操作定义:若二叉树为空,则空操作;否则(1) 访问根结点;(2) 先序遍历左子树;(3) 先序遍历右子树。伪码算法:void PreOderTraverse(BiTree T)/采用二叉链表存储结构if(T)putchar(T-data);/最简单的访问结点法,输出结点元素,这里先访问根结点PreOderTraverse(T-lchild);PreOderTraverse(T-rchild);中序遍历二叉树的操作定义:若二叉树为空,则空操作;否则(1) 中序遍历左子树;(2
14、) 访问根结点;(3) 中序遍历右子树。伪码算法:void InOderTraverse(BiTree T)/采用二叉链表存储结构if(T)InOderTraverse(T-lchild);/先遍历左子树putchar(T-data);/ 最简单的访问结点法,输出结点元素,这里第二访问根结点InOderTraverse(T-rchild); 后序遍历二叉树的操作定义:若二叉树为空,则空操作;否则(1) 后序遍历左子树;(2) 后序遍历右子树;(3) 访问根结点。伪码算法:void PostOderTraverse(BiTree T)/采用二叉链表存储结构if(T)PostOderTravers
15、e(T-lchild);/先遍历左子树PostOderTraverse(T-rchild);/再遍历右子树putchar(T-data);/最后访问根结点 2)二叉树的建立算法描述:对二叉树“遍历”基本操作已经建立的基础上,可以在便利过程中对结点进行各种操作,如:在遍历过程中生成结点,建立二叉树存储结构。采用先序遍历建立二叉树链表:(1) 按先序序列输入二叉树中结点的元素,以空格表示空,直到输入回车为止;(2) 若元素值为空,则赋值NULL;否则生成一个新的结点,将元素值赋值给该跟结点的数值域;(3) 建立该跟结点的左子树;(4) 建立该根结点的右子树。伪码算法;BiTree CreateBi
16、Tree(BiTree T)/构造二叉树T,按先序序列输入二叉树中结点的值(一个字符),空格表示空树char ch;if(ch=getchar()= )T=NULL;elseif(ch!=n)if(!(T=(BiTree)malloc(sizeof(BiTNode)exit(1);T-data=ch; /生成根结点T-lchild=CreateBiTree(T-lchild);/构造左子树T-rchild=CreateBiTree(T-rchild);/构造右子树 return T;/返回所构造二叉树(子)树的地址3)二叉树的层次遍历算法分析:有时需要一层层访问二叉树,比如判断二叉树是否为完全
17、二叉树、找出指定层中含有的叶子/度为2/度为1的结点等,这就需要另一种遍历方法层次遍历。先访问的结点,其孩子结点必然也先访问,引入队列存储已被访问的,但其左右孩子尚未访问的结点的指针。算法描述:(1)若结点不为空,则访问该结点,并将其入列;(2)接着从队列中取已被访问的,但其左右孩子尚未被访问的;(3)访问该结点的左孩子,将其入列;(4)访问该结点的右孩子,将其入列。伪码算法:int visit(TElemType e)/简单的结点访问函数if(e)putchar(e);/打印该结点元素return 1;elsereturn 0;void LevelTraverse(BiTree T)Link
18、Queue *Q=(LinkQueue *)malloc(sizeof(LinkQueue);BiTree p=(BiTree)malloc(sizeof(BiTNode);InitQueue(Q);/初始化队列,队列的元素为二叉树的结点指针if(T!=NULL)if(!visit(T-data)/访问该结点exit(1);EnQueue(Q,T);/将已被访问的,但左右孩子没被访问的结点入列while(!QueueEmpty(Q)/队列不为空,则尚有未被访问其孩子的结点p=DeQueue(Q);/将该结点出列,返回其地址if(p-lchild!=NULL)if(!visit(p-lchild
19、-data)/访问左孩子exit(1);EnQueue(Q,p-lchild);/将其入列if(p-rchild!=NULL)if(!visit(p-rchild-data)/访问右孩子exit(1);EnQueue(Q,p-rchild);/将其入列4)求二叉树的深度算法描述:(1) 若结点不为空,则求其左子树的深度,并返回其值h1;(2) 求其右子树的深度,也返回其值h2;(3) 选择左右子树深度的最大值,将其加一(该结点本身深度)即为该结点子树的深度。伪码算法:int BiTreeDepth(BiTree T)/后序遍历求树T所指二叉树的深度int hl=0,hr=0;if(!T)ret
20、urn 0;elsehl=BiTreeDepth(T-lchild);/求左子树的深度hr=BiTreeDepth(T-rchild);/求右子树的深度if(hl=hr)return hl+1;else return hr+1;/子树深度的最大值再加上本身所在结点的深度记为子树的深度5)求二叉树的宽度算法描述:(1) 定义一个数组,来存放每层的结点数,max来存放到这层为止时的最大结点数;(2) 计算每一层的结点数将其赋值给对应的数组元素;(3) 每层计算完后,用max与本层结点数比较,若max小,则将本层结点数赋值给max;(4) 最后返回max。伪码算法:int BiTreeWidth(B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉树基本操作实验报告 二叉 基本 操作 实验 报告
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【Fis****915】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【Fis****915】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。