线索二叉树课程设计
Status backorderThreading(bithrtree &thrt,bithrtree T)-------------后序线索化
{void backthreading(bithrtree p)} -------------后序线索化子函数
void first(bithrtree thrt) --------------先序遍历
6)编写课程设计报告。
以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。
指导教师(签字):教研室主任(签字):
批准日期:2012年6月18日
摘 要
本次课程设计以二叉树为基础,重点讨论二叉树的存储表示以及如何建立一任意二叉树,阐述如何对二叉树进行线索化及利用线索进行对二叉树遍历的过程,并按中序遍历和先序遍历的顺序线索化以上二叉树,实现在一已经中序线索化后的二叉树上插入和删除结点,并保证索引不破坏。
图3.1模块流程图
4
线索二叉树的主要函数设置如下:
树的存储的类型为:typedef struct bithrnode
{
char data;
struct bithrnode *lchild,*rchild;
int ltag,rtag;
}bithrnode,*bithrtree;
主程序:
bithrtree T, p,T1;
void mid(bithrtree thrt) ---------------中序遍历
void last(bithrtree t) --------------后序遍历
bithrtree copy(bithrtree &r) ---------复制建立后的二叉树
bithrtree creat(bithrtree &T)
注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。
课程设计任务书
2011—2012学年第2学期
专业:计算机应用技术学号:姓名:
课程设计名称:专业基础综合课程设计
设计题目:线索二叉树的实现
完成期限:自2012年6月18日至2012年6月29日共2周
设计内容:
n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。
struct bithrnode *lchild,*rchild; //左右孩子指针
int ltag,rtag;
}bithrnode,*bithrtree;
bithrtree pre;
bithrtree creat(bithrtree &T)//构造二叉树
{char ch;
fflush(stdin);
PreThreading(p->rchild); //右子树线索化
}
}
Status PreOrderThreading(bithrtree &thrt,bithrtree T)//先序线索二叉树
{if(!(thrt=(bithrtree)malloc(sizeof(bithrnode))))
return error;
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)
图4.4后序线索化
Status backorderThreading(bithrtree &thrt,bithrtree T)
5
#include<stdio.h>
#include <string.h>
#include<malloc.h>
#include<stdlib.h>
#define OVERFLOW -2
图4.2先序线索化
PreOrderThreading(bithrtree &thrt,bithrtree T)
(3)中序线索化设计流程如图4.3所示
图4.3中序线索化
Status InOrderThreading(bithrtree &thrt,bithrtree T)
(4)后序线索化设计流程如图4.4所示
运用VC++编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。
要求:
1)阐述设计思想,画出流程图;
2)任意建立一棵二叉树,采用前序、中序、后序三种方法线索化二叉树;
3)说明测试方法,写出完整的运行结果;
4)从时间、空间对算法分析;
5)较好的界面设计;
{void PreThreading(bithrtree p)} ---------先序线索化子函数
Status InOrderThreading(bithrtree &thrt,bithrtree T) ----------中序线索化
{void inthreading(bithrtree &p)} ----------中序线索化子函数
backorderThreading(p,T); -------------后序线索化
last(p); --------------后序遍历
}
}while(k!=0);
子程序:
bithrtree creat(bithrtree &T) --------建立二叉树
Status PreOrderThreading(bithrtree &thrt,bithrtree T) ---------先序线索化
pre->rchild=thrt;pre->rtag=thread; //最后一个结点线索化
thrt->rchild=pre;
}
return OK;
}
void inthreading(bithrtree &p)//中序线索化
{
if (p)
{inthreading(p->lchild); //左子树线索化
专业基础综合课程设计
设计说明书
线索二叉树的实现
学生姓名
xxx
学号
班级
成绩
指导教师
数学与计算机科学学院
2012 年 6月 29日
专业基础综合课程设计评阅书
题目
线索二叉树的实现
学生姓名
学号
指导教师评语及成绩
成绩:教师签名:年月日
答辩教师评语及成绩
成绩:教师签名:年月日
教研室意见
总成绩:室主任签名:年月日
thrt->ltag=link;
thrt->rtag=thread; //建头结点
thrt->rchild=thrt; //右指针回指
if(!T)
thrt->lchild=thrt; //空二叉树
else
{thrt->lchild=T;
pre=thrt;
PreThreading(T); //先序遍历进行先序线索化
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)//中序线索化二叉树
int k;
Do
{
switch(k)
{
case 1:
creat(T); --------建立二叉树
T1=copy(T); ---------复制建立后的二叉树
case 2:
T=copy(T1); ---------复制建立后的二叉树
PreOrderThreading(p,T); ---------先序线索化
{
if(!(thrt=(bithrtree)malloc(sizeof(bithrnode))))
exit(OVERFLOW);
thrt->ltag=link;
thrt->rtag=thread; //建头结点
thrt->rchild=thrt; //右指针回指
scanf("%c",&ch);
if(ch==' '||ch=='#')
T=NULL;
else
{if(!(T=(bithrnode *)malloc(sizeof(bithrnode))))