数据结构树的有关算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计任务书
学期:11-12-2 班级:网络10
一、设计目的
《数据结构》是一门实践性较强的专业基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
二、设计要求
1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、学生必须仔细研读《数据结构》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。
3、本次课程设计按照教学要求需要在一周半时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。
4、编程语言任选。
三、设计选题
题一:线索二叉树(**)
任务:
1.建立中序线索二叉树,并且中序遍历;
2.求中序线索二叉树上已知结点中序的前驱和后继;
需求分析和概要设计:
建立中序线索二叉树,并且中序遍历。首先就是要建立树,再将树中序线索化。求中序线索二叉树上已知结点中序的前驱和后继时,即是将树在遍历一遍。也可以在遍历的过程中,将树的结点放在数组中,当然必须讲述先遍历一遍,这是用空间来换时间。
详细设计:
树的结构体的声明:
typedef char TElemtype;
typedef enum PointerTag{Link,Thread}; //设置标志:Link为指针,Thread为线索typedef struct BiThrNode{ //树结点结构体
TElemtype data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
相关函数的声明:
void InitBiTree(BiThrTree &T); //初始化树
void CreatBiTree(BiThrTree &T); //建立二叉树
void InOrderThreading(BiThrTree &Thrt,BiThrTree &T); //中序线索二叉树
void InThreading(BiThrTree p); //线索化
int InOrderTraverse_Thr(BiThrTree T); //中序遍历
void InOrderThread_BeAf(); //求已知结点中序的前驱和后继初始化树:
void InitBiTree(BiThrTree &T)
{
T = new BiThrNode;
if(!T) exit(1);
T = NULL;
}
建立二叉树:
void CreatBiTree(BiThrTree &T)
{
char ch;
cin>>ch;
if(ch == '@') T = NULL;
else
{
T = new BiThrNode;
if(!T) exit(1);
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
中序线索二叉树:
void InOrderThreading(BiThrTree &Thrt,BiThrTree &T)
{
Thrt = new BiThrNode; //设置头结点
if(!Thrt) exit(1);
Thrt->LTag = Link; //头结点左边标志为指针
Thrt->RTag =Thread; //右边的为线索
Thrt->rchild = Thrt; //有孩子指向头结点本身
if(!T) Thrt->lchild = Thrt; //若树根结点为空,则头结点左孩子指向头结点
else
{ //若根结点不为空,Thrt->lchild = T; //头结点左孩子指向根结点
pre = Thrt; //设置指针pre指向头结点
InThreading(T); //线索化树T
pre->rchild = Thrt;
pre->RTag = Thread;
Thrt->rchild = 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;
}
pre = p;
InThreading(p->rchild);
}
}
中序遍历:
int InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
int i=1;
p = T->lchild;
while(p!=T)
{
while(p->LTag!=Thread)