线索二叉树课程设计说明书1.docx
《线索二叉树课程设计说明书1.docx》由会员分享,可在线阅读,更多相关《线索二叉树课程设计说明书1.docx(12页珍藏版)》请在冰豆网上搜索。
![线索二叉树课程设计说明书1.docx](https://file1.bdocx.com/fileroot1/2023-1/26/85a1ccf6-0c80-40ac-9b34-73df2ae48004/85a1ccf6-0c80-40ac-9b34-73df2ae480041.gif)
线索二叉树课程设计说明书1
课程名称:
数据结构-课程设计
课程代码:
8404181
题目:
线索二叉树的应用
年级/专业/班:
20、
学生姓名:
学 号:
312、
开始时间:
2010年12月1日
完成时间:
2011年1月10日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月日
指导教师签名日期年月日
系主任审核日期年月日
摘要
数据结构是计算机科学的算法理论基础和软件设计的技术基础,在计算机领域中有着举足轻重的作用。
而二叉树形结构是一类重要的非线性结构。
线索二叉树形结构是结点之间有分支,并具有层次关系的结构。
二叉树在计算机领域中也有着广泛的应用,例如在编译程序中,用二叉树来表示源程序的语法结构;在数据库系统中,可用线索二叉树来组织信息;在分析算法的行为时,可用二叉树来描述其执行过程。
它非常类似于自然界中的树。
树结构在客观世界中是大量存在的,例如家谱、行政组织机构都可用树形象地表示。
本次课程设计以二叉树为基础,重点讨论二叉树的存储表示以及如何建立一任意二叉树,阐述如何对二叉树进行线索化及利用线索进行对二叉树遍历的过程,并按中序遍历和先序遍历的顺序线索化以上二叉树,实现在一已经中序线索化后的二叉树上插入和删除结点,并保证索引不破坏。
关键字:
数据结构二叉树线索先序遍历
1、引言
1.1问题的提出
随着计算机的普及,网络进入大众的家庭,随之而来的也产生了一些值得探究的问题,如何把现实生活中的问题用计算机来解决,如何用我们所学的知识来解决,如何利用我们所学的数据结构知识来解决,这些都是值得我们深入思考的问题。
本次实验的主要目的是实现对二叉树的各种操作。
二叉树,是一种重要的非线性结构。
从数据结构角度看,数据结构中二叉树有很多的遍历算法,但本质都是将属性结构转换为线性序列,从而简化问题。
在遍历序列中,每个节点都有自己的前驱和后驱,但在二叉树遍历过程中寻求答案却因为时间复杂度等因素使操作效率低下,而线索二叉树很好地解决了这一问题。
本文就在二叉树的基础上加入线索二叉树实现数据的快速可操作性的。
1.2设计目的
通过本次的课程设计,掌握二叉树的创建,熟悉按中序遍历的顺序线索化二叉树,掌握按先序遍历的顺序线索化所创建的二叉树,并实现对在一已经中序线索化后的二叉树上插入和删除结点,并保证索引不破坏。
1.3任务内容
任务:
(1)建立一任意二叉树
(2)按中序遍历的顺序线索化以上二叉树。
(3)按先序遍历的顺序线索化以上二叉树。
(4)实现在一已经中序线索化后的二叉树上插入和删除结点,并保证索引不破坏。
2、系统分析
本次任务重要是编写一个“二叉树的应用”的程序。
本程序主要可以分为以下几个部分:
二叉树的创建,二叉树的线索化,二叉树的先序遍历,二叉树的中序遍历,节点的插入和删除。
2.1功能需求
功能主要需要的是二叉树的创建以及将其线索化,线索化后的二叉树进行先序遍历以及中序遍历,对线索二叉树进行节点的插入和删除相关操作。
2.2程序运行的环境
visualc++6.0
3、流程图设计
图3-1线索二叉树程序流程图
上图为本程序的主要流程图:
程序的编辑主要分为三个部分:
(1)创建二叉树并线索化。
(2)中序和先序遍历线索化的二叉树。
(3)在中序线索化后的二叉树上插入和删除结点。
4、详细设计模块分析
4.1:
程序核心代码如下:
BiThrTreeT,T1,Thrt,Thrt1;
printf("请输入二叉树:
");
CreatBiThrTree(T1);
printf("\n中序遍历二叉树的结果:
\n");
InOrder_Traverse(T1,PrintElement);
printf("\n线索化后中序遍历二叉树结果为:
");
InOrderThreading(Thrt1,T1);
printf("\n");
InOrderTraverse(Thrt1,PrintElement);
printf("\n\n\n请输入二叉树:
");
CreatBiThrTree(T);
printf("\n先序遍历二叉树结果为:
");
PreOrderTraverse(T,PrintElement);
printf("\n线索化后先序遍历二叉树结果为:
");
PreOrderThreading(Thrt,T);
PreOrderTraverse_Thr(Thrt,PrintElement);
printf("\n");
4.2创建二叉树:
voidCreatBiThrTree(BiThrTree&T)
{//按先序次序输入二叉树中结点的值,空格表示空树
//构造二叉树T
Telemtypech;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
if(!
(T=(BiThrTree)malloc(sizeof(BiThrNode))))
exit(OVERFLOW);
T->data=ch;//生成根节点
T->LTag=0;
T->RTag=0;
CreatBiThrTree(T->lchild);//构造左子树
CreatBiThrTree(T->rchild);//构造右子树
}
}
4.3线索化二叉树:
(1)先序线索化二叉树的函数:
voidPreThreading(BiThrTreep)
{
if(p)
{
if(!
p->lchild)//建前驱线索
{
p->LTag=1;
p->lchild=pre;
}
if(!
pre->rchild)//建后继线索
{
pre->RTag=1;
pre->rchild=p;
}
pre=p;//保持pre指向p的前驱
if(p->LTag==0)
PreThreading(p->lchild);//左子树线索化
if(p->RTag==0)
PreThreading(p->rchild);//右子树线索化
}
}
(2)中序线索化二叉树:
voidInThreading(BiThrTreep)
{
if(p)
{
InThreading(p->lchild);//左子树线索化
if(!
p->lchild)//建前驱线索
{
p->LTag=1;
p->lchild=pre;
}
if(!
pre->rchild)//建后继线
{
pre->RTag=1;
pre->rchild=p;
}
pre=p;//保持pre指向p的前驱
InThreading(p->rchild);//右子树线索化
}
}
4.4遍历二叉树:
(1)先序遍历二叉树:
voidPreOrderThreading(BiThrTree&Thrt,BiThrTreeT)
{//先序遍历二叉树T,并将其中序线索化,Thrt指向头结点。
if(!
(Thrt=(BiThrTree)malloc(sizeof(BiThrNode))))
exit(OVERFLOW);
Thrt->LTag=0;
Thrt->RTag=1;//建头结点
Thrt->rchild=Thrt;//右指针回指
if(!
T)Thrt->lchild=Thrt;//若二叉树空,则左指针回指
else
{
Thrt->lchild=T;
pre=Thrt;
PreThreading(T);//先序遍历进行先序线索化
pre->rchild=Thrt;
pre->RTag=1;//最后一个结点线索化
Thrt->rchild=pre;
}
}
(2)中序遍历二叉树:
voidInOrderTraverse(BiThrTreeT,int(*Visit)(Telemtype))
{//采用二叉链表存储结构,Visit是对数据元素操作的应用函数。
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit。
BiThrTreep;
p=T->lchild;
while(p!
=T)
{
while(p->LTag==0)p=p->lchild;
if(!
Visit(p->data))exit(ERROR);
while(p->RTag==1&&p->rchild!
=T)
{
p=p->rchild;
Visit(p->data);
}
p=p->rchild;
}
}
5.系统的调试
5.1.程序编码和调试
用visualc++6.0编译器来编写代码。
如图5-1所示。
图5-1程序调试
在进入系统时会进行提示输入二叉树,程序开始,如图5-2所示:
图5-2程序开始
这时输入任意二叉树,如图5-3所示:
图5-3输入二叉树
当输入二叉树后按回车键,对输入的二叉树进行中序遍历,并对其线索化,再对线索化后的二叉树进行中序遍历,如图5-4所示:
图5-4线索化中序遍历
当对线索化后的二叉树进行中序遍历后,系统会自动提醒用户输入二叉树,用户输入二叉树,如图5-5所示:
图5-5输入二叉树
当选择输入二叉树后,按回车键,会对输入的二叉树进行先序遍历,并对其先序线索化,再对线索化后的二叉树先序遍历,如图5-6所示:
图5-6线索化先序遍历
5.2调试的过程反应的问题和所学到的知识
在调试过程中,发现了十多个错误,其中有大部分为语法错误,只有一个算法错误。
先更正语法错误,在对算法错误进行了分析和更改,通过调试,错误全部更正,程序顺利运行。
在调试过程中学到,程序之间的衔接问题是很重要的。
在后面的程序实现中,调用了前面的程序,但是前面的程序没用考虑到后面程序的要求。
从而导致了程序发生的错误。
通过这次调试程序,我学会了逐步调试的方法,即先对语法错误进行修改,然后才是算法错误。
这样调试花费的时间会大大减少。
另外在编写程序的时候要小心,仔细,因为大部分错误都出现在语法上,这是可以避免的。
6.总结
在本次课程设计中,我遇到了一些难题,但也让我受益颇多。
本系统是以VisualC++6.0为开发工具编的程序。
本系统实现了对二叉树创建,先序和中序遍历以及线索化后先序和中序遍历的功能。
当第一周结束的时候,我感觉自己收获挺大的,从一开始的迷茫,不知道从何下手到把程序中的几个模块编写出来,心里挺开心的。
但是到了第二周,我由不得不再次陷入困境。
在整个程序的编写过程中。
最难的就是遍历和线索化这两个模块,这也是我第二周要解决的重点问题。
开始编写二叉树的线索化时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了线索化的程序,但编译时老出错。
困难之时,在老师的帮助之下,完成了线索化这个模块。
这样的话,整个程序基本上全部完成了,就剩下完善工作了。
我写了两个程序,最后,两个程序相互组合,互补,最后大功告成。
虽然设计时完成了,但是我觉得其中还是由一些不足之处,整个程序完成了,还有很多不完善的地方,希望自己以后办事的时候要认真,仔细,考虑周全。
在准备过程中,我锻炼了自己解决问题的能力,在不懂的情况下通过到图书馆借阅图书,网上查看资料讨论请教,了解线索二叉树的相关知识和使用方法。
同时熟悉了二叉树的创建,在遍历二叉树的程序阶段,由于前面没有考虑二叉树的结构,导致了程序的问题。
通过这些问题我逐步使自己形成全面看问题的习惯,同时对自己思维的全面性也是一个极好的锻炼。
在调试过程中,提高了自己发现调试错误的能力。
同时发现了自身在更改调试过程中缺乏前后连接的,逐步跟进的能力。
在假设验证设计过程中,考验了自己考虑问题全面性的能力。
总的来说,这次课程设计使我看到了我的不足,在解决问题的过程中,也使我对本专业有了一定的兴趣,更对编程产生了极大的信心。
7.参考文献
[1]严蔚敏吴伟民.《数据结构(C语言版第三版)》.北京:
清华大学出版社,2007
[2]谭浩强.《C程序设计(第三版)》.北京:
清华大学出版社,2006.9
[3]谭浩强.《C程序设计题解与上机指导(第三版)》.北京:
清华大学出版社;2006.9
[4]张基温唐永炎.《C语言程序设计教程》.北京:
高等教育出版社,1992
[5]徐翠霞崔玲玲.《数据结构》.北京:
中国电力出版社;2006.
[6]HerbertSchildt.《C语言大全(第二版)》.北京:
电子工业出版社,1994
[7]谭浩强.《C++程序设计》.北京:
清华大学出版社,2004
[8]蒋盛益.《数据结构.学习指导与训练》.北京:
中国水利水电出版社,2003
[9]胡元义邓亚玲罗作民.《数据结构(c语言)实践教程》.西安:
西安电子科技大学出版社,2002.