数据结构实验6:二叉树的线索化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验6:二叉树的线索化
一、实验目的
1.掌握线索二叉树的存储结构。
2.掌握将一棵二叉树线索化算法。
3.掌握线索二叉树的遍历算法,理解算法在效率上的改进。
4.将算法用C语言编写完整程序并上机运行,记录实验过程与数据。
二、实验仪器:
1.硬件:Lenovo通用PC机,
2.软件:WINDOWS7,WORD,GCC编译器
三、实验原理:
1.线索化算法
四、实验步骤:
1.设计一个实验样本,取二叉树为:
2.定义一个线索二叉树的结点;
此处填写具体代码
3.按先序的方式建立一棵普通的二叉树;此处填写具体代码
4.将普通二叉树线索化
此处填写具体代码
5.按线性方式遍历线索二叉树
此处填写具体代码
五、数据处理及结论
1.输入:
A↙B↙D↙#↙#↙E↙#↙#↙C↙F↙#↙#↙G↙#↙#
注:每个↙符号代表输入确定,即回车
2.输出:
C B E A F C G
C B E A F C G
七、思考题:
1.为什么要将一棵二叉树线索化?
2.为什么在线索化的过程中preNode要使用全局变量?附:
#include
#include
#include
#define NULLFLAG '#'
typedef char elemType;
typedef enum{
FALSE,TRUE
}status;
typedef enum{
link,thread
}pointerTag;
typedef struct NODE{
elemType data;
struct NODE *lchild,*rchild;
int lTag,rTag;
}biThreadTreeNode;
//定义一个全局变量指针preNode,在线索化时记录每个结点的直接前驱结点biThreadTreeNode *preNode;
status biThreadTreeNodeInit(biThreadTreeNode *t,elemType e){ if(t){
t->data=e;
t->lchild=NULL;
t->rchild=NULL;
t->lTag=link;
t->rTag=link;
return TRUE;
}
else
return FALSE;
}
//按先序遍历的方法建立一棵二叉树,空位用空格号代替
status biThreadTreeCreate(biThreadTreeNode **t){
elemType ch;
//fflush(stdin);//如果使用清空缓存的这句,则每输入一个字符要回车一次ch=getchar();
if(ch==NULLFLAG){
*t=NULL;
return FALSE;
}
else{
*t=(biThreadTreeNode*)malloc(sizeof(biThreadTreeNode));
if(*t){
biThreadTreeNodeInit(*t,ch);
biThreadTreeCreate(&((*t)->lchild));
biThreadTreeCreate(&((*t)->rchild));
}
}
return TRUE;
}
//按中序遍历的方式输出一棵二叉树
void biThreadTreePrint(biThreadTreeNode *t){
if(t){
biThreadTreePrint(t->lchild);
printf("%4c",t->data);
biThreadTreePrint(t->rchild);
}
}
//按中序遍历的方式将二叉树线索化
status biTreeThreading(biThreadTreeNode *t){
if(!t)
return FALSE;
else{
biTreeThreading(t->lchild);
if(t->lchild==NULL){
t->lchild=preNode;
t->lTag=thread;
}
if(preNode->rchild==NULL){
preNode->rchild=t;
preNode->rTag=thread;
}
preNode=t;
biTreeThreading(t->rchild);
}
return TRUE;
}
//完整的线索化过程
status inOrderThreading(biThreadTreeNode *head,biThreadTreeNode *t){ head->rchild=head;
head->rTag=thread;
if(t==NULL){
head->lchild=head;
head->lTag=thread;
return FALSE;
}
else{
head->lTag=link;
head->lchild=t;
preNode=head;
biTreeThreading(t);
head->rchild=preNode;
preNode->rchild=head;
preNode->rTag=thread;
}
return TRUE;
}
status threadTraversal(biThreadTreeNode *head){
biThreadTreeNode *p;
if(head==NULL)
return FALSE;
p=head->lchild;
while(p!=head){
while(p->lTag==link)
p=p->lchild;
printf("%4c",p->data);