线索二叉树课程设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p->lchild = pre;
} //前驱线索
if(!pre->rchild)
{pre->rtag = thread;
pre->rchild = p;
} //后继线索
pre = p;
if(p->ltag==link)
PreThreading(p->lchild); //左子树线索化
if(p->rtag ==link)
专业基础综合课程设计
设计说明书
线索二叉树的实现
学生姓名
xxx
学号
班级
成绩
指导教师
数学与计算机科学学院
2012 年 6月 29日
专业基础综合课程设计评阅书
题目
线索二叉树的实现
学生姓名
学号
指导教师评语及成绩
成绩:教师签名:年月日
答辩教师评语及成绩
成绩:教师签名:年月日
教研室意见
总成绩:室主任签名:年月日
void mid(bithrtree thrt) ---------------中序遍历
void last(bithrtree t) --------------后序遍历
bithrtree copy(bithrtree &r) ---------复制建立后的二叉树
bithrtree creat(bithrtree &T)
图4.4后序线索化
Status backorderThreading(bithrtree &thrt,bithrtree T)
5
#include<stdio.h>
#include <string.h>
#include<malloc.h>
#include<stdlib.h>
#define OVERFLOW -2
注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。
课程设计任务书
2011—2012学年第2学期
专业:计算机应用技术学号:姓名:
课程设计名称:专业基础综合课程设计
设计题目:线索二叉树的实现
完成期限:自2012年6月18日至2012年6月29日共2周
设计内容:
n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
scanf("%c",&ch);
if(ch==' '||ch=='#')
T=NULL;
else
{if(!(T=(bithrnode *)malloc(sizeof(bithrnode))))
return error;
T->data=ch;
T->ltag=0;
T->rtag=0;
printf("输入父结点%c的左孩子:",ch);
#define OK 1
#define error 0
typedef int Status;
typedef enum pointertag{ link=0,thread=1 }; //link==0; 指针 thread==1;线索
typedef struct bithrnode
{char data;
PreThreading(p->rchild); //右子树线索化
}
}
Status PreOrderThreading(bithrtree &thrt,bithrtree T)//先序线索二叉树
{if(!(thrt=(bithrtree)malloc(sizeof(bithrnode))))
return error;
6)编写课程设计报告。
以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。
指导教师(签字):教研室主任(签字):
批准日期:2012年6月18日
摘 要
本次课程设计以二叉树为基础,重点讨论二叉树的存储表示以及如何建立一任意二叉树,阐述如何对二叉树进行线索化及利用线索进行对二叉树遍历的过程,并按中序遍历和先序遍历的顺序线索化以上二叉树,实现在一已经中序线索化后的二叉树上插入和删除结点,并保证索引不破坏。
图3.1模块流程图
4
线索二叉树的主要函数设置如下:
树的存储的类型为:typedef struct bithrnode
{
char dat百度文库;
struct bithrnode *lchild,*rchild;
int ltag,rtag;
}bithrnode,*bithrtree;
主程序:
bithrtree T, p,T1;
{
if(!(thrt=(bithrtree)malloc(sizeof(bithrnode))))
exit(OVERFLOW);
thrt->ltag=link;
thrt->rtag=thread; //建头结点
thrt->rchild=thrt; //右指针回指
(1)创建二叉树(CreateBiTree(T))
设计思想:在用户需要创建二叉树时,屏幕提醒输入树的各个结点,包括空结点的输入,完成输入后,程序自动依次读入各个结点,以空结点作为判断结点位置的主要依据。设计流程如图4.1所示。
图4.1CreateBiTree(T )
创建二叉树
(2)先序线索化二叉树
设计思想:由于线索化的实质是将二叉链表中的空指针改为指向遍历时得到的前驱或后继的线索,因此线索化的过程即为在遍历过程中修改空指针的过程,附设一个指针pre始终指向刚刚访问过的结点,若指针p指向当前结点,则pre指向他的前驱。由此可得先序遍历建立先序线索化的设计流程如图4.2所示。
struct bithrnode *lchild,*rchild; //左右孩子指针
int ltag,rtag;
}bithrnode,*bithrtree;
bithrtree pre;
bithrtree creat(bithrtree &T)//构造二叉树
{char ch;
fflush(stdin);
在线索化的实现过程中,要进行三个部分:
首先,保证该树已经存在,必须在树存在的基础上进行线索化。
再次,确定线索化需要三种不同的线索化,先序、中序、后序线索化。
最后,完成三种不同的遍历——先序、中序、后序遍历,输出二叉树。
3 概要设计
这是一个能对二叉树线索化的程序,其中包括对二叉树的先序、中序、后序线索化,最后遍历线索化并输出遍历结果。其中线索化要实现对同一个树的线索化,即应具备还原线索化后二叉树的程序,并重新对二叉树线索化。主要的功能模块流程图如图3.1所示。
int k;
Do
{
switch(k)
{
case 1:
creat(T); --------建立二叉树
T1=copy(T); ---------复制建立后的二叉树
case 2:
T=copy(T1); ---------复制建立后的二叉树
PreOrderThreading(p,T); ---------先序线索化
thrt->ltag=link;
thrt->rtag=thread; //建头结点
thrt->rchild=thrt; //右指针回指
if(!T)
thrt->lchild=thrt; //空二叉树
else
{thrt->lchild=T;
pre=thrt;
PreThreading(T); //先序遍历进行先序线索化
构建二叉树的过程中,通过先序构建,在构建初,对于线索的初值都赋值0,然后进行线索化的过程分别应用了三种对应的先、中、后的线索,然后在其三种的线索的基础上进行三种遍历,进而完成二叉树线索遍历的实现。输出三种遍历后的不同结果,从而完成本次试验。
2需求分析
必须确定本次实验的目的,即完成二叉树的线索化、完成二叉树的一般操作。完成本次实验,必须确定该树的存储对象,即值域、左子树、右子树、还有控制线索的rtag、ltag。
Status backorderThreading(bithrtree &thrt,bithrtree T)-------------后序线索化
{void backthreading(bithrtree p)} -------------后序线索化子函数
void first(bithrtree thrt) --------------先序遍历
if (!p->lchild)
{ p->lchild=pre;
p->ltag=thread;
}
if (!pre->rchild)
{pre->rchild=p;
pre->rtag=thread;
}
pre = p;
inthreading(p->rchild); //右子树线索化
}
}
Status InOrderThreading(bithrtree &thrt,bithrtree T)//中序线索化二叉树
backorderThreading(p,T); -------------后序线索化
last(p); --------------后序遍历
}
}while(k!=0);
子程序:
bithrtree creat(bithrtree &T) --------建立二叉树
Status PreOrderThreading(bithrtree &thrt,bithrtree T) ---------先序线索化
运用VC++编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。
要求:
1)阐述设计思想,画出流程图;
2)任意建立一棵二叉树,采用前序、中序、后序三种方法线索化二叉树;
3)说明测试方法,写出完整的运行结果;
4)从时间、空间对算法分析;
5)较好的界面设计;
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;
图4.2先序线索化
PreOrderThreading(bithrtree &thrt,bithrtree T)
(3)中序线索化设计流程如图4.3所示
图4.3中序线索化
Status InOrderThreading(bithrtree &thrt,bithrtree T)
(4)后序线索化设计流程如图4.4所示
{void PreThreading(bithrtree p)} ---------先序线索化子函数
Status InOrderThreading(bithrtree &thrt,bithrtree T) ----------中序线索化
{void inthreading(bithrtree &p)} ----------中序线索化子函数
pre->rchild=thrt;pre->rtag=thread; //最后一个结点线索化
thrt->rchild=pre;
}
return OK;
}
void inthreading(bithrtree &p)//中序线索化
{
if (p)
{inthreading(p->lchild); //左子树线索化
first(p); --------------先序遍历
case 3: T=copy(T1); ---------复制建立后的二叉树
InOrderThreading(p,T); ----------中序线索化
mid(p);---------------中序遍历
case 4: T=copy(T1); ---------复制建立后的二叉树
关键词:线索化;二叉树;先序;中序;后序,遍历
4详细设计.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .4
1 课题描述
本次试验通过对二叉树进行线索化后三种遍历的实现,三种遍历的过程必须找到序列中的第一个结点,然后依次找出结点后继直至其后继为空时为结束。
} //前驱线索
if(!pre->rchild)
{pre->rtag = thread;
pre->rchild = p;
} //后继线索
pre = p;
if(p->ltag==link)
PreThreading(p->lchild); //左子树线索化
if(p->rtag ==link)
专业基础综合课程设计
设计说明书
线索二叉树的实现
学生姓名
xxx
学号
班级
成绩
指导教师
数学与计算机科学学院
2012 年 6月 29日
专业基础综合课程设计评阅书
题目
线索二叉树的实现
学生姓名
学号
指导教师评语及成绩
成绩:教师签名:年月日
答辩教师评语及成绩
成绩:教师签名:年月日
教研室意见
总成绩:室主任签名:年月日
void mid(bithrtree thrt) ---------------中序遍历
void last(bithrtree t) --------------后序遍历
bithrtree copy(bithrtree &r) ---------复制建立后的二叉树
bithrtree creat(bithrtree &T)
图4.4后序线索化
Status backorderThreading(bithrtree &thrt,bithrtree T)
5
#include<stdio.h>
#include <string.h>
#include<malloc.h>
#include<stdlib.h>
#define OVERFLOW -2
注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。
课程设计任务书
2011—2012学年第2学期
专业:计算机应用技术学号:姓名:
课程设计名称:专业基础综合课程设计
设计题目:线索二叉树的实现
完成期限:自2012年6月18日至2012年6月29日共2周
设计内容:
n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
scanf("%c",&ch);
if(ch==' '||ch=='#')
T=NULL;
else
{if(!(T=(bithrnode *)malloc(sizeof(bithrnode))))
return error;
T->data=ch;
T->ltag=0;
T->rtag=0;
printf("输入父结点%c的左孩子:",ch);
#define OK 1
#define error 0
typedef int Status;
typedef enum pointertag{ link=0,thread=1 }; //link==0; 指针 thread==1;线索
typedef struct bithrnode
{char data;
PreThreading(p->rchild); //右子树线索化
}
}
Status PreOrderThreading(bithrtree &thrt,bithrtree T)//先序线索二叉树
{if(!(thrt=(bithrtree)malloc(sizeof(bithrnode))))
return error;
6)编写课程设计报告。
以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。
指导教师(签字):教研室主任(签字):
批准日期:2012年6月18日
摘 要
本次课程设计以二叉树为基础,重点讨论二叉树的存储表示以及如何建立一任意二叉树,阐述如何对二叉树进行线索化及利用线索进行对二叉树遍历的过程,并按中序遍历和先序遍历的顺序线索化以上二叉树,实现在一已经中序线索化后的二叉树上插入和删除结点,并保证索引不破坏。
图3.1模块流程图
4
线索二叉树的主要函数设置如下:
树的存储的类型为:typedef struct bithrnode
{
char dat百度文库;
struct bithrnode *lchild,*rchild;
int ltag,rtag;
}bithrnode,*bithrtree;
主程序:
bithrtree T, p,T1;
{
if(!(thrt=(bithrtree)malloc(sizeof(bithrnode))))
exit(OVERFLOW);
thrt->ltag=link;
thrt->rtag=thread; //建头结点
thrt->rchild=thrt; //右指针回指
(1)创建二叉树(CreateBiTree(T))
设计思想:在用户需要创建二叉树时,屏幕提醒输入树的各个结点,包括空结点的输入,完成输入后,程序自动依次读入各个结点,以空结点作为判断结点位置的主要依据。设计流程如图4.1所示。
图4.1CreateBiTree(T )
创建二叉树
(2)先序线索化二叉树
设计思想:由于线索化的实质是将二叉链表中的空指针改为指向遍历时得到的前驱或后继的线索,因此线索化的过程即为在遍历过程中修改空指针的过程,附设一个指针pre始终指向刚刚访问过的结点,若指针p指向当前结点,则pre指向他的前驱。由此可得先序遍历建立先序线索化的设计流程如图4.2所示。
struct bithrnode *lchild,*rchild; //左右孩子指针
int ltag,rtag;
}bithrnode,*bithrtree;
bithrtree pre;
bithrtree creat(bithrtree &T)//构造二叉树
{char ch;
fflush(stdin);
在线索化的实现过程中,要进行三个部分:
首先,保证该树已经存在,必须在树存在的基础上进行线索化。
再次,确定线索化需要三种不同的线索化,先序、中序、后序线索化。
最后,完成三种不同的遍历——先序、中序、后序遍历,输出二叉树。
3 概要设计
这是一个能对二叉树线索化的程序,其中包括对二叉树的先序、中序、后序线索化,最后遍历线索化并输出遍历结果。其中线索化要实现对同一个树的线索化,即应具备还原线索化后二叉树的程序,并重新对二叉树线索化。主要的功能模块流程图如图3.1所示。
int k;
Do
{
switch(k)
{
case 1:
creat(T); --------建立二叉树
T1=copy(T); ---------复制建立后的二叉树
case 2:
T=copy(T1); ---------复制建立后的二叉树
PreOrderThreading(p,T); ---------先序线索化
thrt->ltag=link;
thrt->rtag=thread; //建头结点
thrt->rchild=thrt; //右指针回指
if(!T)
thrt->lchild=thrt; //空二叉树
else
{thrt->lchild=T;
pre=thrt;
PreThreading(T); //先序遍历进行先序线索化
构建二叉树的过程中,通过先序构建,在构建初,对于线索的初值都赋值0,然后进行线索化的过程分别应用了三种对应的先、中、后的线索,然后在其三种的线索的基础上进行三种遍历,进而完成二叉树线索遍历的实现。输出三种遍历后的不同结果,从而完成本次试验。
2需求分析
必须确定本次实验的目的,即完成二叉树的线索化、完成二叉树的一般操作。完成本次实验,必须确定该树的存储对象,即值域、左子树、右子树、还有控制线索的rtag、ltag。
Status backorderThreading(bithrtree &thrt,bithrtree T)-------------后序线索化
{void backthreading(bithrtree p)} -------------后序线索化子函数
void first(bithrtree thrt) --------------先序遍历
if (!p->lchild)
{ p->lchild=pre;
p->ltag=thread;
}
if (!pre->rchild)
{pre->rchild=p;
pre->rtag=thread;
}
pre = p;
inthreading(p->rchild); //右子树线索化
}
}
Status InOrderThreading(bithrtree &thrt,bithrtree T)//中序线索化二叉树
backorderThreading(p,T); -------------后序线索化
last(p); --------------后序遍历
}
}while(k!=0);
子程序:
bithrtree creat(bithrtree &T) --------建立二叉树
Status PreOrderThreading(bithrtree &thrt,bithrtree T) ---------先序线索化
运用VC++编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。
要求:
1)阐述设计思想,画出流程图;
2)任意建立一棵二叉树,采用前序、中序、后序三种方法线索化二叉树;
3)说明测试方法,写出完整的运行结果;
4)从时间、空间对算法分析;
5)较好的界面设计;
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;
图4.2先序线索化
PreOrderThreading(bithrtree &thrt,bithrtree T)
(3)中序线索化设计流程如图4.3所示
图4.3中序线索化
Status InOrderThreading(bithrtree &thrt,bithrtree T)
(4)后序线索化设计流程如图4.4所示
{void PreThreading(bithrtree p)} ---------先序线索化子函数
Status InOrderThreading(bithrtree &thrt,bithrtree T) ----------中序线索化
{void inthreading(bithrtree &p)} ----------中序线索化子函数
pre->rchild=thrt;pre->rtag=thread; //最后一个结点线索化
thrt->rchild=pre;
}
return OK;
}
void inthreading(bithrtree &p)//中序线索化
{
if (p)
{inthreading(p->lchild); //左子树线索化
first(p); --------------先序遍历
case 3: T=copy(T1); ---------复制建立后的二叉树
InOrderThreading(p,T); ----------中序线索化
mid(p);---------------中序遍历
case 4: T=copy(T1); ---------复制建立后的二叉树
关键词:线索化;二叉树;先序;中序;后序,遍历
4详细设计.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .4
1 课题描述
本次试验通过对二叉树进行线索化后三种遍历的实现,三种遍历的过程必须找到序列中的第一个结点,然后依次找出结点后继直至其后继为空时为结束。