收藏 分销(赏)

二叉树的建立与遍历及二叉树的线索化及线索化遍历.doc

上传人:w****g 文档编号:3141716 上传时间:2024-06-19 格式:DOC 页数:11 大小:230KB
下载 相关 举报
二叉树的建立与遍历及二叉树的线索化及线索化遍历.doc_第1页
第1页 / 共11页
二叉树的建立与遍历及二叉树的线索化及线索化遍历.doc_第2页
第2页 / 共11页
二叉树的建立与遍历及二叉树的线索化及线索化遍历.doc_第3页
第3页 / 共11页
二叉树的建立与遍历及二叉树的线索化及线索化遍历.doc_第4页
第4页 / 共11页
二叉树的建立与遍历及二叉树的线索化及线索化遍历.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、精选文档昆明理工大学信息工程与自动化学院学生实验报告(20112012学年 第1学期)课程名称:数据结构 开课实验室:信自楼442 2011年 11月 06日年级、专业、班学号姓名成绩实验项目名称 二叉树的建立与遍历及二叉树的线索化及线索化遍历指导教师教师评语教师签名: 年 月 日一、 程序功能:(1).线索二叉树的主要函数设置如下:1.树的存储的类型为:typedef struct bithrnodechar data;struct bithrnode *lchild,*rchild; int ltag,rtag;bithrnode,*bithrtree;2.主程序:bithrtree T,

2、 p,T1;int k;Doswitch(k) case 1: creat(T); -建立二叉树T1=copy(T); -复制建立后的二叉树case 2: T=copy(T1); -复制建立后的二叉树PreOrderThreading(p,T); -先序线索化first(p); -先序遍历case 3: T=copy(T1); -复制建立后的二叉树InOrderThreading(p,T); -中序线索化mid(p); -中序遍历case 4: T=copy(T1); -复制建立后的二叉树backorderThreading(p,T); -后序线索化last(p); -后序遍历while(k!

3、=0);3.子程序:bithrtree creat(bithrtree &T) -建立二叉树Status PreOrderThreading(bithrtree &thrt,bithrtree T) -先序线索化void PreThreading(bithrtree p) -先序线索化子函数Status InOrderThreading(bithrtree &thrt,bithrtree T) -中序线索化void inthreading(bithrtree &p) -中序线索化子函数Status backorderThreading(bithrtree &thrt,bithrtree T)

4、-后序线索化void backthreading(bithrtree p) -后序线索化子函数void first(bithrtree thrt) -先序遍历void mid(bithrtree thrt) -中序遍历void last(bithrtree t) -后序遍历bithrtree copy(bithrtree &r) -复制建立后的二叉树bithrtree creat(bithrtree &T) (2).程序代码如下:#include#include #include#include#define OVERFLOW -2#define OK 1#define error 0type

5、def int Status;typedef enum pointertag link=0,thread=1 ; /link=0; 指针 thread=1;线索typedef struct bithrnode char data;struct bithrnode *lchild,*rchild; /左右孩子指针int ltag,rtag;bithrnode,*bithrtree;bithrtree pre; bithrtree creat(bithrtree &T) /构造二叉树 char ch;fflush(stdin); scanf(%c,&ch);if(ch= |ch=#)T=NULL;

6、else if(!(T=(bithrnode *)malloc(sizeof(bithrnode)return error; T-data=ch;T-ltag=0;T-rtag=0;printf(输入父结点%c的左孩子:,ch); T-lchild=creat(T-lchild);printf(输入父结点%c的右孩子:,ch);T-rchild=creat(T-rchild);return T; void PreThreading(bithrtree p) /先序线索化 if(p)if(!p-lchild) p-ltag = thread;p-lchild = pre; /前驱线索if(!pr

7、e-rchild) pre-rtag = thread;pre-rchild = p; /后继线索pre = p; if(p-ltag=link)PreThreading(p-lchild); /左子树线索化if(p-rtag =link)PreThreading(p-rchild); /右子树线索化 Status PreOrderThreading(bithrtree &thrt,bithrtree T) /先序线索二叉树 if(!(thrt=(bithrtree)malloc(sizeof(bithrnode) return error;thrt-ltag=link;thrt-rtag=t

8、hread; /建头结点thrt-rchild=thrt; /右指针回指if(!T)thrt-lchild=thrt; /空二叉树else thrt-lchild=T;pre=thrt; PreThreading(T); /先序遍历进行先序线索化pre-rchild=thrt;pre-rtag=thread; /最后一个结点线索化thrt-rchild=pre;return OK; void inthreading(bithrtree &p) /中序线索化 if (p) inthreading(p-lchild); /左子树线索化 if (!p-lchild) p-lchild=pre; p-

9、ltag=thread; if (!pre-rchild) pre-rchild=p; pre-rtag=thread; pre = p; inthreading(p-rchild); /右子树线索化 Status InOrderThreading(bithrtree &thrt,bithrtree T) /中序线索化二叉树if(!(thrt=(bithrtree)malloc(sizeof(bithrnode)exit(OVERFLOW);thrt-ltag=link;thrt-rtag=thread; /建头结点thrt-rchild=thrt; /右指针回指if(!T)thrt-lchi

10、ld=thrt; /若二叉树为空,则左指针回指else thrt-lchild=T;pre=thrt;inthreading(T); /中序遍历进行中序线索化pre-rchild=thrt;pre-rtag=thread; /最后一个结点线索化thrt-rchild=pre;return OK;void backthreading(bithrtree p) /后序线索化 if(p) backthreading(p-lchild); backthreading(p-rchild); if(!p-lchild) p-ltag=thread; p-lchild=pre; /前驱线索 if(!pre-

11、rchild) pre-rtag=thread; pre-rchild=p; /后继线索 pre=p; Status backorderThreading(bithrtree &thrt,bithrtree T) /后序线索化二叉树 if(!(thrt = (bithrtree)malloc(sizeof(bithrnode)exit(OVERFLOW);thrt-ltag=link;thrt-rtag=thread; /建头结点thrt-rchild=thrt; if(!T)thrt-lchild=thrt; /若二叉树为空,则左指针回指else thrt-lchild=T;pre=thrt

12、;backthreading(T); /中序遍历进行中序线索化pre-rchild=thrt; pre-rtag=thread; /最后一个结点线索化thrt-rchild=pre;return OK;void first(bithrtree thrt) /先序遍历二叉树 bithrtree p;printf(先序遍历结果为: );p=thrt-lchild; while(p!=thrt)printf(%c ,p-data); while(p-ltag = link)p=p-lchild;printf(%c ,p-data); while(p-rtag=thread)&(p-rchild!=t

13、hrt) p = p-rchild; printf(%c ,p-data); p = p-rchild;printf(n);void mid(bithrtree thrt) /中序遍历二叉树 bithrtree p;printf(中序遍历结果为: ); p=thrt-lchild; while(p!=thrt) while(p-ltag = link)p=p-lchild; printf(%c ,p-data); while(p-rtag=thread)&(p-rchild!=thrt) p = p-rchild; printf(%c ,p-data); p = p-rchild;printf

14、(n);bithrtree parents(bithrtree &thrt,bithrtree &p) bithrtree t; t=thrt;if(t-lchild=p)return t; /父节点是头结点 else t=t-lchild; while( t-lchild!=p & t-rchild!=p ) if(link=t-rtag)t=t-rchild; /结点有右结点,往右 else t=t-lchild; /如果结点没有右孩子,去左孩子,没有左孩子,去前驱 return t; void last(bithrtree t) /后序遍历二叉树 bithrtree p,q; p=t-l

15、child; while(1) while(p-ltag=link)p=p-lchild; if(p-rtag=link)p=p-rchild; /p指向第一个被访问的结点 else break; while(p!=t)printf(%c ,p-data); q=parents(t,p); /parent是p的双亲: if(t=q) p=t; /若parent是thrt,即p是根结点,则无后继 elseif(p=q-rchild|thread=q-rtag) p=q; /若p是双亲的右孩子,或者是独生左孩子,则后继为双亲 else while(q-rtag=link) /若p是有兄弟的左孩子,

16、则后继为双亲的右子树上后序遍历访问的第一个节点。 q=q-rchild; while(q-ltag=link) q=q-lchild; p=q; printf(n);bithrtree copy(bithrtree &r) /复制一棵二叉树 bithrtree tr;if(r=NULL) tr=NULL;else if(!(tr=(bithrtree)malloc(sizeof(bithrnode) return 0;tr-data=r-data;tr-ltag=r-ltag;tr-rtag=r-rtag;tr-lchild=copy(r-lchild);tr-rchild=copy(r-rc

17、hild);return tr; void main() /主函数 bithrtree T, p,T1;int k;do printf(t-线索二叉树-nn); printf (t建二叉树 1 );printf (ttt先序遍历线索化二叉树 2 n); printf (t中序遍历线索化二叉树 3 ); printf (t后序遍历线索化二叉树 4 n);printf (t结束输入 0n); printf(nt-nn); printf (请输入您的选择:); scanf (%d,&k);switch(k) case 1: printf(t-结束为 #- n); printf(请输入树的根结点:);

18、 creat(T); T1=copy(T);system(cls); break; case 2: T=copy(T1);PreOrderThreading(p,T); first(p); system(pause); system(cls); break; case 3: T=copy(T1);InOrderThreading(p,T); mid(p);system(pause);system(cls); break; case 4: T=copy(T1);backorderThreading(p,T); last(p);system(pause); system(cls); default

19、: break;while(k!=0);printf(nt谢谢使用!n);二、实验报告:(1).运行过程 1.如图6.1所示的二叉树线索化的理论结果: 先序遍历线索化二叉树结果为:abdefcg 中序遍历线索化二叉树结果为:edfbacg 后序遍历线索化二叉树结果为:efdbaabcgdfe图6.1创建的二叉树 2.如图6.21所示的二叉树的实际结果: 1)创建二叉树的实际结果如下图: 2)先序遍历线索化二叉树的实际结果如下图所示:3)中序遍历线索化二叉树的实际结果如下所示: 4)后序遍历线索化二叉树的实际结果如下图所示:5)结束界面如下图所示:(2).算法分析1.当对树进行线索和遍历时,首先

20、必须建立二叉树,没有建立二叉树、当遍历时树为空,其次遍历的过程必须在线索化的后面进行,这样才能够体现出本次试验的目的线索化二叉树。遍历的实现还需要与其对应的线索化进行一 一对应,否则遍历的结果是错误的。2.线索二叉树的时间复杂度和空间复杂度,因为在线索的过程都必须要申请存储空间,就是需要多少存储空间,就申请空间,但是在后面需要复制本二叉树的信息,所以也要求与建立的书的存储空间相同,即空间复杂度为(n)。(3).时间复杂度1.遍历和线索的时间复杂度都是O(n),因为在其过程中线索一个走其下一个节点,过程依次将所有节点线索完成。2.遍历同样是该过程进行的,所以遍历的时间复杂度同样为O(n)。(4)

21、.总结在写本次实验报告的过程中,通过上机我对二叉树有了深刻的了解:n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为线索)。这种加上了线索的二叉树称为线索二叉树(ThreadedBinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。(范文素材和资料部分来自网络,供参考。可复制、编制,期待你的好评与关注)

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服