ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:48.47KB ,
资源ID:10788303      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10788303.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验指导书06.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验指导书06.docx

1、数据结构实验指导书06实验六 树与二叉树6.1实验目的:(1) 掌握二叉树链表的结构和二叉树的建立过程;(2) 掌握二叉树的基本操作,加深对二叉树的理解,逐步培养解决实际问题的编程能力。6.2实验要求:(1) 复习课本中有关树与二叉树的知识;(2) 用C语言完成算法和程序设计并上机调试通过;(3) 撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。6.3基础实验实验1 二叉树的构造实验内容与要求:按先序序列构造一棵二叉链表表示的二叉树T;分析:二叉树是每个结点至多

2、只有两棵子树,并有左、右之分,顺序不能任意颠倒的一种非线性结构。二叉树常用的存储结构是二叉链表形式,二叉链表由一个数据项data(用于存放结点的值)和两个指针项lchild、rchild(分别指向该结点的左、右子树)。结点及结构如图6-1所示: /- - - - - - 二叉树的二叉链表存储表示模型- - - - - - -typedef struct BiTNode TElemType data; Struct BiTNode * lchild, * rchild; /左右孩子指针BiTNode, * BiTree;将此结构定义放在一个头文件BiTNode.h里,可避免在后面的参考程序中代码

3、重复书写,另外在该头文件里给出二叉链表的初始化及常量的定义。实现提示按先序序列建立一棵二叉树,先构造根结点,再构造根的左、右子树;每一棵子树又都是一颗二叉树,所以构造一棵子树的过程与构造整棵二叉树的过程完全相同, 按照先序序列,先构造根,再构造左子树,然后构造右子树;采用递归形式直到叶子结点为止。以下是算法描述:Status CreateBiTree(BiTree &T)/按先序次序输入二叉树中结点的值(一个字符),字符表示空树,/构造二叉链表表示的二叉树T。scanf(&ch);if (ch=) T=NULL;else if (!(T=(BiTNode *) malloc(sizeof(Bi

4、TNode) exit (OVERFLOW); T-data = ch; /生成根结点 CreateBiTree(T-lchild); /生成左子树 CreateBiTree(T-rchild); /生成右子树return OK;/CreateBiTree参考程序:/头文件BiTNode.h的内容如下: #include #include #include #define MAX 20#define OK 1#define ERROR 0#define NULL 0#define OVERFLOW 0typedef char TElemType;typedef int Status;typed

5、ef struct BiTNode TElemType data;struct BiTNode *lchild,*rchild;BiTNode,*BiTree;BiTree CreateBiTree(BiTree T) char ch; scanf(%c,&ch); if (ch=#) T=NULL; /* #代表空指针*/ else T=(BiTNode*)malloc(sizeof(BiTNode); if(!T) exit(OVERFLOW); /*申请结点 */ T-data=ch; /*生成根结点 */ T-lchild=CreateBiTree(T-lchild); /*构造左子树

6、 */ T-rchild=CreateBiTree(T-rchild); /*构造右子树 */ /以下是主程序shiyan6_1_1.c#include BiTNode.hmain() BiTree T=NULL; printf(n请读入构造二叉树的字符序列:); CreateBiTree(T); /*建立一棵二叉树T*/ 实验2 二叉树的遍历实验内容与要求:对一棵二叉链表表示的二叉树进行先序遍历、中序遍历、后序遍历和层序遍历并分别输出遍历的结点顺序。分析:二叉树的先序遍历是:若二叉树为空,则空操作;否则,访问根结点,先序遍历左子树,先序遍历右子树。二叉树的中序遍历是:若二叉树为空,则空操作;

7、否则,中序遍历左子树,访问根结点,中序遍历右子树。二叉树的后序遍历是:若二叉树为空,则空操作;否则,后序遍历左子树,后序遍历右子树;访问个结点。二叉树的层序遍历是:在访问二叉树的结点时按照自上而下,从左至右的顺序。根作为第一层,根的孩子作为第二层,以此类推。先序遍历二叉树递归算法Status PreOrderTraverse(BiTree T, Status (* Visit)(TElemType e)/采用二叉链表存储结构,Visit是对数据元素操作的应用函数,/先序遍历二叉树T,对每个结点调用函数Visit一次且仅一次。/一旦visit()失败,则操作失败。if (T) if (Visit

8、(T-data) if (PreOrderTraverse(T-lchild,Visit) if (PreOrderTraverse(T-rchild,Visit) return OK;return ERROR;else return OK;/ PreOrderTraverse中序遍历的递归算法Status InOrderTraverse(BiTree T, Status (* Visit)(TElemType e)if (T)if (InOrderTraverse(T-rchild,Visit) if (Visit(T-data) if (InOrderTraverse(T-rchild,V

9、isit) return OK;return ERROR;else return OK;/ InOrderTraverse后序遍历递归算法Status PostOrderTraverse(BiTree T, Status(* Visit)(TElemType e)if (T) if (PostOrderTraverse(T-lchild,Visst) )if (PostOrderTraverse(T-rchild,Visit)if (Visit(T-data) return OK;return ERROR;else return OK;/ PreOrderTraverse层次遍历二叉树的非递归

10、算法Status LevelOrder(BiTree T) /按层次遍历二叉树T, Q为队列 InitQueue(Q); If (T!=NULL)/ 若树非空EnQueue(Q,T);/根结点入队列 While (!QueueEmpty(Q) DeQueue(Q,b); /队首元素出队列 Visit(b-data); /访问结点 If (b-lchild!=NULL) EnQueue(Q,b-lchild);/左子树非空,则入队列 If (b-rchold!=Null) EnQueue(Q,b-rchild);/右子树非空,则入队列 /while /ifLevelOrder参考程序: /以下代

11、码保存在文件shiyan6_1_2.c#include #include BiTNode.hStatus PrintElement(TElemType e) printf(%2c,e); return OK;Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType) int i,j,k; if(T=NULL) return OK; else i=Visit(T-data); if(i) j=PreOrderTraverse(T-lchild,Visit); /*先序遍历左子树*/ if(j) k=PreOrderTraverse(T-r

12、child,Visit);/*先序遍历右子树*/ if(k) return OK; else return ERROR; Status InOrderTraverse( BiTree T, Status(*Visit)(TElemType) )/*中序遍历*/ if (T) if (InOrderTraverse(T-lchild, Visit) if (Visit(T-data) if (InOrderTraverse(T-rchild, Visit) return OK; return ERROR; else return OK;Status PostOrderTraverse( BiTr

13、ee T, Status(*Visit)(TElemType) )/*后序遍历*/ if (T) if (PostOrderTraverse(T-lchild, Visit) if (PostOrderTraverse(T-rchild, Visit) if (Visit(T-data) return OK; return ERROR; else return OK;void LevleOrder(BiTree T) /*层次遍历二叉树T,从第一层开始,每层从左到右*/ BiTree QueueMAX,b;/*用一维数组表示队列,front和rear分别表示队首和队尾指针*/ int fron

14、t,rear; front=rear=0; if(T) /*若树非空*/ Queuerear+=T; /*根结点入队列*/ while (front!=rear) /*当队列非空*/ b=Queuefront+; /*队首元素出队列,并访问这个结点*/ printf(%2c,b-data); if(b-lchild!=NULL) Queuerear+=b-lchild; /*左子树非空,则入队列*/ if(b-rchild!=NULL) Queuerear+=b-rchild; /*右子树非空,则入队列*/ /*LevelOrder*/void main() BiTree T=NULL,B;

15、printf(n请读入构造二叉树的字符序列:); B=CreateBiTree(T); /*建立一棵二叉树T*/ printf(n该二叉树的先序遍历是:); PreOrderTraverse(B,PrintElement); /*先序遍历二叉树*/ printf(n该二叉树的中序遍历); InOrderTraverse( B, PrintElement ); /*中序遍历二叉树*/ printf(n该二叉树的后序遍历); PostOrderTraverse( B,PrintElement); /*后序遍历二叉树*/ printf(n该二叉树的层次遍历是:); LevleOrder(B); /*

16、层次遍历二叉树*/ getchar();实验3叶子结点统计实验内容与要求:统计一棵二叉树的叶子结点的个数分析: 叶子结点是二叉树中既没有左孩子又没有有孩子的结点。采用递归方式。求一棵二叉树的叶子结点数的递归模型如下。f(bt)=0; 若为空树时f(bt)=1; 若只有根结点时,该根结点是叶结点f(bt)=f(btree-lchild)+f(btree-rchild); 其它参考程序:#include #include BiTNode.hint leafcount(BiTree bt)/*统计二叉树bt中叶子结点数*/ int n; if(bt=NULL) n=0; else if(bt-lch

17、ild=NULL&bt-rchild=NULL) n=1; else n=leafcount(bt-lchild)+leafcount(bt-rchild); /*二叉树叶子结点数等于左、右子树的叶子结点数之和*/ return n;void main() BiTree T=NULL; int m; printf(n请输入要构造二叉树的结点序列:); T=CreateBiTree(T); /*建立一棵二叉树T*/ m=leafcount(T); printf(叶子结点数是:%d,m); getchar(); getchar();实验二叉树的深度统计实验内容与要求:统计一棵二叉树的深度。分析若一

18、棵二叉树是空树,则它的深度为,否则它的深度取值为它的左、右子树中深度最大的深度加。int depth(BiTree T) /*求二叉树的深度*/int dep1,dep2;if (T=NULL) return 0; else dep1=depth(T-lchild);dep2=depth(T-rchild);return dep1dep2?dep1+1:dep2+1; /depth参考程序:/以下代码存放在文件shiyan6_1_4.c 文件中#include #include BiTNode.hint depth(BiTree T) /*求二叉树的深度*/int dep1,dep2;if (

19、T=NULL)return ERROR;else dep1=depth(T-lchild); dep2=depth(T-rchild); return dep1dep2?dep1+1:dep2+1;/*depth*/void main()BiTree T=NULL; printf(n请输入所构造二叉树的结点序列:); T=CreateBiTree(T); /*建立一棵二叉树T*/printf(n二叉树的深度是:%d,depth(T);getchar();实验5子树交换实验内容与要求:试编写算法,对一棵二叉树根结点不变,将左、右子树进行交换,树中每个结点的左、右子树进行交换。分析:子树交换就是将

20、原来的二叉树中每个结点的左、右子树分别交换生成一棵新的二叉树,该二叉树与原来二叉树成对称形状。先将二叉树根结点的左、右子树交换,然后在将左(右)子树的左、右子树交换直到子树为空树。void Exchange(BiTree T) BiTNode p; if(T) p = T-lchild; T-lchild = T-rchild; T-rchild = p; Exchange(T-lchild); Exchange(T-rchild); 参考程序:/以下代码存放在文件shiyan6_1_5.c#include #include BiTNode.h void Exchange(BiTree T)

21、BiTNode *p;if(T) p=T-lchild; T-lchild=T-rchild; T-rchild=p; Exchange(T-lchild); Exchange(T-rchild);void main()BiTree T=NULL;printf(n请输入要构造二叉树的节点序列:);T=CreateBiTree(T); /*建立一棵二叉树T*/Exchange( T) ;实验6线索二叉树实验内容与要求:构造一棵二叉链表表示的二叉树,并将其中序遍历线索化。分析:在一棵有N个结点的二叉树中,有N+1个指针域为空。把这些空的指针项加以利用,将空的左指针指向其前驱,空的右指针指向后继,

22、这样的指针九百能了线索。线索化就是通过将空的左指针指向其前驱,空的右指针指向其后继,使非线性的二叉树线性化的过程。线索二叉树采用线索链表表示,链表结构为图6-2(b)所示,在二叉链表结构(图6-2(a)所示)的基础上增加了两个标志域LTag和RTag。这两个标志域当其值为1时,指向其前驱和后继。值为0时保持其指针指向不变。具体情况: 中序遍历线索化二叉树就是在对线索树中序遍历的过程中为左标志域为1的结点寻找前驱,为由标志域为1的结点寻找后继。结点的后继是中序遍历其右子树时访问的第一个结点,结点的前驱是中序遍历其左子树时最后访问的一个结点。先构造一棵用线索链表表示的二叉树T,辅设一个全局变量pr

23、e用于记录离当前结点p最后“访问”的结点。对该二叉树T进行中序遍历,生成线索化后二叉树的头结点Thrt,如果p的左标志域为空,则将其变为线索,并让其左指针指向pre,pre就是中序遍历二叉树Thrt时p结点的前驱;如果pre的右标志域为空,则p就是pre的后继,将pre的右标志域变为线索。参考程序:/以下代码保存在文件shiyan6_1_6.c中#include #include #includetypedef char DataType; /*定义DataType类型*/typedef enum Link,Thread PointerTag;typedef struct nodeDataTy

24、pe data;struct node *lchild, *rchild; /*左右孩子子树*/PointerTag LTag,RTag;BiThrNode;/*结点类型*/typedef BiThrNode *BiThrTree ; /*二叉树类型*/*构造二叉树*/void CreatBinTree(BiThrTree *T)/*构造二叉链表,注意:输入序列是先序序列*/ char ch; if (ch=getchar()= ) *T=NULL; else /*读入非空格*/ T=(BiThrNode *)malloc(sizeof(BiThrNode); /*生成结点*/ (*T)-da

25、ta=ch;(*T)-LTag=Link;(*T)-RTag=Link; CreatBinTree(&(*T)-lchild); /*构造左子树 */ CreatBinTree(&(*T)-rchild); /*构造右子树*/ BiThrTree pre;/*全局变量*/void 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;

26、/*后继线索*/pre=p;/*保持pre指向p*/ InThreading(p-rchild);/*右子树线索化*/ int InOrderThreading(BiThrTree *Thrt,BiThrTree T) /*中序遍厉二叉树T,并将其中序线索化,Thrt指向头结点*/if(!(*Thrt=(BiThrTree)malloc(sizeof(BiThrNode) exit(0); (*Thrt)-LTag=Link;(*Thrt)-RTag=Thread;/*建头结点*/ (*Thrt)-rchild=*Thrt;/*右指针回指*/ if (!T)(*Thrt)-lchild=*Th

27、rt; else (*Thrt)-lchild=T;pre=*Thrt;InThreading(T);/*中序遍历进行中序线索化*/ pre-rchild=*Thrt;pre-RTag=Thread;/*最后一个结点线索化*/ (*Thrt)-rchild=pre; return 1;/输出结点int print(BiThrTree e)printf(%d %c %dn,e-LTag,e-data,e-RTag);return 1;/中序遍历线索化二叉树int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e)/*T指向头结点,头结点的

28、左链lchild指向根结点,中序遍厉二叉树 BiThrTree p; p=T-lchild; /*p指向根结点*/ while(p!=T) /*空树或遍厉结束时,p=T*/ while(p-LTag=Link) p=p-lchild; if(!visit(p) return 0; /*打印*/while(p-RTag=Thread&p-rchild!=T) p=p-rchild;visit(p);/*访问后继结点*/ p=p-rchild; return 1;void main()/*测试程序*/BiThrTree T,Thrt; CreatBinTree(&T);InOrderThreading(&Thrt, T);InOrderTraverse(Thrt ,print);6.4 提高实验实验1 哈夫曼树与哈夫曼编码实验内容与要求:从终端读入一段电文(允许出现标

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1