先序线索化

先序线索化
先序线索化

南通大学数据结构实践课

实验报告册

姓名:耿智

班级:软件工程092

学号:0913063042

实验名称:先序线索化

指导老师:丁卫平

南通大学杏林学院

2011年6月16日

1.程序设计简介

本实验程序用于验证二叉树的先序线索化及先序线索二叉树先序遍历算法,为了查看线索结果,增加了线索显示功能。设计时综合考虑到中序线索化需求,采用设计一个基类,然后在此基础上生成所需的对象。

2.源程序

#include "Base.cpp"

template

class CPreThreading:public CThr

{

bool IsThreaded;

public:

CPreThreading(){IsThreaded=false;}

void Pre_ThreadBiTree(); //生成先序线索二叉树

void Pre_Thread(BiThrNode*p,BiThrNode**h); //先序线索

void Pre_TraThrBiTree(); //遍历先序线索二

叉树

void ShowPreTree(); //显示线索化后的信息

};

template

void CPreThreading::Pre_ThreadBiTree()

{ //生成先序线索二叉链表

BiThrNode*bt,*q=NULL;

bt=BT; //根结点

Pre_Thread(bt,&q);

}

//--------------------------------------------------------------------------------

template

void CPreThreading::Pre_TraThrBiTree()

{

if(IsThreaded==false){cout<<"请先线索化!"<

cout<<"\n--------------------------------------------------"<

cout<<"遍历先序线索二叉树得:";

BiThrNode*p;

if(BT==NULL) return ; //二叉链表为空

cout<data<<' '; //输出根结点的值

p=BT->lchild; //沿左子树

if(p==NULL) p=BT->rchild; //左子树为空则沿右子树

while(p!=NULL)

{

cout<data<<' '; //输出当前结点的值

while(p->lflag==0) //沿左链访问直到左标志非0

{

p=p->lchild;

cout<data<<' ';

}

p=p->rchild;

}

cout<<"\n--------------------------------------------------"<

}

//--------------------------------------------------------------------------------

template

void CPreThreading::Pre_Thread(BiThrNode*bt,BiThrNode**h) {

BiThrNode*p,*q; //定义两个结点指针变量

if(bt!=NULL) //bt指向的结点不空

{

p=bt->lchild ;

q=bt->rchild ;

//若当前访问的结点的左指针为空,则将上次访问的结点赋给左指针域,并置标志域

if((*h!=NULL)&&(p==NULL))

{

bt->lchild= *h;

bt->lflag= 1;

}

//若上次访问的结点的右指针为空

//则将访问过的结点指针赋给当前结点的右指针域,并置标志域为1

if((*h!=NULL)&&((*h)->rchild==NULL))

{

(*h)->rchild=bt;

(*h)->rflag=1;

}

*h=bt; //记下当前访问的结点

Pre_Thread(p,h); //访问左子树

Pre_Thread(q,h); //访问右子树

}

IsThreaded=true;

}

//--------------------------------------------------------------------------------

template

void CPreThreading::ShowPreTree()

{

if(IsThreaded==false){cout<<"请先线索化!"<

cout<<"\n--------------------------------------------------"<

cout<<"下面显示的是先序线索化以后的结果:"<

BiThrNode*p;

if(BT==NULL) return ; //二叉链表为空。

if(BT->lflag==1) //如果标志域为1,输出它的前驱。

cout<<"值为:"<data<<"结点的前驱是:"<lchild->data<

if(BT->rflag==1) //如果标志域为1,输出它的后继。

cout<<"值为:"<data<<"结点的后继是:"<rchild->data<

p=BT->lchild; //沿左子树。

if(p==NULL) p=BT->rchild; //左子树为空则沿右子树。

while(p!=NULL)

{

if(p->lflag==1) //如果标志域为1,输出它的前驱。

cout<<"值为:"<data<<"结点的前驱是:"<lchild->data<

if(p->rflag==1) //如果标志域为1,输出它的后继。

cout<<"值为:"<data<<"结点的后继是:"<rchild->data<

while(p->lflag==0) //沿左链访问直到左标志非0

{

p=p->lchild;

if(p->lflag==1) //如果标志域为1,输出它的前驱。

cout<<"值为:"<data<<"结点的前驱是:"<lchild->data<

if(p->rflag==1) //如果标志域为1,输出它的后继。

cout<<"值为:"<data<<"结点的后继是:"<rchild->data<

}

p=p->rchild;

}

cout<<"--------------------------------------------------"<

}

//--------------------------------------------------------------------------------

void main()

{

int opr;//操作变量

CPreThreading Tr;//创建一个int 模板类型的对象

do{

system("cls");

cout<<"----------菜单---------------"<

cout<<"--* 1:创建二叉树*--"<

cout<<"--* 2:先序线索化二叉树*--"<

cout<<"--* 3:先序线索化二叉树先序遍历*--"<

cout<<"--* 4:显示先序线索信息*--"<

cout<<"--* 5:退出操作*--"<

cout<<"--------------------------------"<

cout<<"请选择操作[ ]";

cout<<"\b\b";

cin>>opr;

switch(opr)

{

case 1:

if(Tr.GetRoot()) Tr.DeleteNode(); //释放之前创建的对象的所有结点空间

Tr.CreateBiTree(-1); //创建二叉树

system("pause");

break;

case 2:

Tr.Pre_ThreadBiTree(); //先序线索化二叉树

cout<<"线索化完成!"<

system("pause");

break;

case 3:

Tr.Pre_TraThrBiTree(); //先序遍历二叉树

system("pause");

break;

case 4:

Tr.ShowPreTree(); //显示线索化之后的标志域信息

system("pause");

break;

case 5:

cout<<"结束运行,Bye-Bye!"<

break;

default:

cout<<"选择不合理,请重选!"<

break;

}

}while(opr!=5);

}

3.程序运行

4.调试感想

在线索化二叉树时,如果像书上把二叉树和线索二叉树的存储结构分开,则二叉树中的数据域不能传递到线索二叉树中(两个类型的指针不能互相赋值)。比较两种存储结构发现,线索二叉树比二叉树多了两个标志域LTag,Rtag。于是两种存储结构合并为BiThrNode,并在建立二叉树时把LTag,Rtag均设置为Link。

线索二叉树课程设计

专业基础综合课程设计 设计说明书 线索二叉树的实现 学生姓名xxx 学号 班级 成绩 指导教师 数学与计算机科学学院 2012 年 6月 29日 专业基础综合课程设计评阅书

题目线索二叉树的实现 学生姓名学号 指导教师评语及成绩 成绩:教师签名:年月日答辩教师评语及成绩 成绩:教师签名:年月日教研室意见 总成绩:室主任签名:年月日注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。

课程设计任务书 2011—2012学年第2学期 专业:计算机应用技术学号:姓名: 课程设计名称:专业基础综合课程设计 设计题目:线索二叉树的实现 完成期限:自2012 年 6 月18 日至2012 年6月29 日共 2 周 设计内容: n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。 运用VC++编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。 要求: 1)阐述设计思想,画出流程图; 2)任意建立一棵二叉树,采用前序、中序、后序三种方法线索化二叉树; 3)说明测试方法,写出完整的运行结果; 4)从时间、空间对算法分析; 5)较好的界面设计; 6)编写课程设计报告。 以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。 指导教师(签字):教研室主任(签字): 批准日期:2012年 6 月18 日 摘要

数据结构课程设计_线索二叉树的生成及其遍历

数据结构课程设计 题目: 线索二叉树的生成及其遍历 学院: 班级: 学生姓名: 学生学号: 指导教师: 2012 年12月5日

课程设计任务书

摘要 针对以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。 关键词二叉树,中序线索二叉树,中序线索二叉树的遍历

目录 摘要 ............................................ 错误!未定义书签。第一章,需求分析................................. 错误!未定义书签。第二章,概要设计 (1) 第三章,详细设计 (2) 第四章,调试分析 (5) 第五章,用户使用说明 (5) 第六章,测试结果 (5) 第七章,绪论 (6) 第八章,附录参考文献 (7)

线索二叉树的生成及其遍历 第一章需求分析 以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。主要任务: 1.建立二叉树; 2.将二叉树进行中序线索化; 3.编写程序,运行并修改; 4.利用中序线索遍历二叉树 5.书写课程设计论文并将所编写的程序完善。 第二章概要设计 下面是建立中序二叉树的递归算法,其中pre为全局变量。 BiThrNodeType *pre; BiThrTree InOrderThr(BiThrTree T) { /*中序遍历二叉树T,并将其中序线索化,pre为全局变量*/ BiThrTree head; head=(BitThrNodeType *)malloc(sizeof(BiThrType));/*设申请头结点成功*/ head->ltag=0;head->rtag=1;/*建立头结点*/ head->rchild=head;/*右指针回指*/ if(!T)head->lchild=head;/*若二叉树为空,则左指针回指*/ else{head->lchild=T;pre=head; InThreading(T);/*中序遍历进行中序线索化*/ pre->rchild=head; pre->rtag=1;/*最后一个结点线索化*/ head->rchild=pre; }; return head; } void InThreading(BiThrTree p) {/*通过中序遍历进行中序线索化*/ if(p)

中序线索化二叉树数据结构

中序线索化二叉树数据结构. 当用二叉链表作为二叉树的存储结构时,因为每个结点中只有指向其左、右孩子结点的指针,所以从任一结点出发只能直接找到该结点的左、右孩子。在一般情况下靠它无法直接找到该结点在某种遍历次序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针,将降低存储空间的效率。 与此同时,我们可以证明:在n个结点的二叉链表中含有n+1个空指针。因为含n个结点的二叉链表中含有2n个指针,除了根结点,每个结点都有一个从父结点指向该结点的指针,因此一共使用了n-1个指针,所以在n个结点的二叉链表中含有2n-(n-1)=n+1个空指针。 因此,可以利用这些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的指针。这种附加的指针称为线索,加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。为了区分一个结点的指针是指向其孩子的指针,还是指向其前驱或后继结点的线索,可在每个结点中增加两个线索标志。这样,线索二叉树结点类型定义为: Lchild Ltag Data Rtag Rchild 其中: 1. Ltag=0时,表示Lchild指向该结点的左孩子; 2. Ltag=1时,表示Lchild指向该结点的线性前驱结点; 3. Rtag=0时,表示Rchild指向该结点的右孩子; 4. Rtag=1时,表示Rchild指向该结点的线性后继结点;

以二叉链表结点数据结构所构成的二叉链表作为二叉树的存储结构,叫做线索二叉链表;指向结点的线性前驱或者线性后继结点的指针叫做线索;加上线索的二叉树称为线索二叉树;对二叉树以某种次序遍历将其变为线索二叉树的过程叫做线索化。 中序线索化是指用二叉链表结点数据结构建立二叉树的二叉链表,然后按照中序遍历的方法访问结点时建立线索。 例如有如上图所示二叉树,则中序遍历的顺序是:O / J * I + H A G 【参考程序】 #include #include typedef enum{Link,Thread} PointerTag; /*指针标志*/ typedef char DataType; typedef struct BiThreTree{ /*定义结点元素*/ PointerTag LTag,RTag; DataType data; struct BiThreTree *lchild,*rchild; }BiThreTree; BiThreTree *pre; /*全局变量,用于二叉树的线索化*/ BiThreTree *CreateT ree() /*按前序输入建立二叉树*/ { BiThreTree *T; DataType ch;

数据结构二叉树遍历及线索化后各种操作(绝对无错)

实验二二叉树的存储结构及各种运算的实现第一题: #include "stdio.h" #include "malloc.h" #define maxsize 66 typedef int datatype; typedef struct node { datatype data ; struct node *lchild,*rchild; } bitree; bitree *Q[maxsize]; bitree *creatree() { char ch; int front,rear; bitree *root,*s; root=NULL; front=1;rear=0; ch=getchar(); while (ch!='#') { s=NULL; if(ch!='@') { s=malloc(sizeof(bitree)); s->data=ch; s->lchild=NULL; s->rchild=NULL; } rear++; Q[rear]=s; if(rear==1) root=s; else { if (s&&Q[front]) if(rear%2==0) Q[front]->lchild=s; else Q[front]->rchild=s; if(rear%2==1)

front++; } ch=getchar(); } return root; } preorder(bitree *t) //前{ if (t) { printf(" %c ",t->data); preorder(t->lchild); preorder(t->rchild); } } inorder(bitree *t) //中{ if (t) { inorder(t->lchild); printf(" %c ",t->data); inorder(t->rchild); } } postorder(bitree *t) //后{ if (t) { postorder(t->lchild); postorder(t->rchild); printf(" %c ",t->data); } } int height(bitree *t) //高度{ int hl,hr; if(!t) return 0; else { hl=height(t->lchild); hr=height(t->rchild); return ((hl>hr?hl:hr)+1); } }

二叉树的线索化

二叉树的线索化: 以二叉链表作为存储结构时,只能找到结点的左、右孩子信 息,而不能直接得到结点在任一序列(先序、中序或后序序列) 中的前驱和后继信息,这种信息只有在遍历的动态过程中才能得 到。为了保存这种在遍历过程中得到的信 息,我们利用二叉链表中的空链域(由于结点没有左子树或右子树), 来存放结点的前驱和后继信息。 作如下规定: ①若结点有左子树,则其lchild 域指示其左孩子,否则令 lchild 域指示其前驱; ②若结点有右子树,则其rchild 域指示其右孩子,否则令 rchild 域指示其后继。 (1)线索链表的结点结构 lchild LTag data RTag rchild 其中: data:数据域; lchild :左指针域,指向该结点的左孩子; rchild :右指针域,指向该结点的右孩子; 0lchild域指示结点的左孩子 LTag = 1lchild域指示结点的前驱 0rchild域指示结点的右孩子 RTag = 1rchild域指示结点的后继 请将根据图 1 所示编写一个程序实现构建线索二叉树。 thrt 0 1 bt 0 A 0 0 B 0 0 C 0 1 D 1 0 E 0 1 F 1 1 G 1 1 H 1 0 I 0 1 J 1 1 k 1 图1

#include #include #include #define NULL 0 #define OK 1 #define ERROR 0 typedef enum PointerTag { Link,Thread };//Link==0, 指向孩子; Thread==1, 指向前驱后继 typedef char TElemType; typedef int Status; //线索化二叉树的存储结构 typedef struct BiThrNode { TElemType data; struct BiThrNode *lchild,*rchild; // 左孩子与右孩子的指针 PointerTag LTag,RTag; //左右标志域,指示是孩子还是前驱后继 } BiThrNode,*BiThrTree; //按照先序输入二叉树各个节点,创建原 始二叉树, Status CreateBiTree(BiThrTree& T) { #表示空树 char ch; scanf("%c",&ch); if('#'==ch) T=NULL; else { T=(BiThrTree )malloc(sizeof(BiThrNode)); if(!T) exit(ERROR); T->data=ch; T->LTag=T->RTag=Link;// 建表时初始化都为 CreateBiTree(T->lchild);// 构造左子树CreateBiTree(T->rchild);// 构造右子树Link( 即 0) } return OK; } BiThrTree pre=NULL; // 定义 pre 为函数 InThreading 的外部变量,使其指向最后一个节点 void InThreading(BiThrTree p); // 函数声明 //中序遍历二叉树,将其线索化,Thrt 指向头结点 Status InOrderThreading(BiThrTree &Thrt,BiThrTree T)

数据结构实验6:二叉树的线索化

实验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){

二叉树的遍历及线索化

青岛理工大学数据结构课程实验报告

void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){ if(T){ Visit(T->data);//首先访问根结点 PreOrderTraverse(T->lchild,Visit);//然后递归遍历左子树 PreOrderTraverse(T->rchild,Visit);//最后递归遍历右子树}} //中序遍历时先递归遍历左子树,然后访问根结点,最后递归遍历右子树;后序遍历时先递归遍历左子树,然后递归遍历右子树,最后 访问根结点 3、//先把栈及队列相关操作的头文件包括进来 1)根指针入栈, 2)向左走到左尽头(入栈操作) 3)出栈,访问结点 4)向右走一步,入栈,循环到第二步,直到栈空 //层次遍历时,若树不空,则首先访问根结点,然后,依照其双亲结 点访问的顺序,依次访问它们的左、右孩子结点; 4.首先建立二叉线索存储:包含数据域,左右孩子指针以及左右标志 typedef enum { Link=0,Thread=1 } PointerTag; typedef struct BiThrNode{ TElemType data; struct BiThrNode *lchild,*rchild;//左右孩子指针 PointerTag LTag,RTag;//左右标志 }BiThrNode, *BiThrTree; 建立前驱线索和后继线索,并用中序遍历进行中序线索化,然后最 后一个结点线索化 调 试 过 程 及 实 验 结 果 把测试数据放在f:\\file\\data.txt里,测试数据为:1 2 4 0 0 0 3 5 0 0 0 总访问结点是指访问该结点的数据域,弄清楚各个指针所指的类型

数据结构——线索二叉树实验报告

线索二叉树应用实验 实验报告 实验目的 (1)掌握线索二叉树的有关知识。 (2)掌握求解线索二叉树中结点前趋和后继的算法以及以相应次序遍历线索二叉树的算法。 (3)掌握二叉树的线索化算法的设计。 实验运行环境 Visual C++ 实验任务 线索二叉树是为了快速求解二叉树中结点在指定次序下的前驱和后继,而将二叉链表中空的左右孩子指针分别改为指向其前驱和后继结点而得到的结构,反映了运算对数据结构的设计的影响。因此,首先要了解线索二叉树的结构特点,其中原本为空的指针被修改为前驱和后继指针,使得对左右子树和线索的判断发生了变化。利用线索可以实现某些次序下的前驱和后继。本实验期望能理解线索二叉树的结构特点,实现各前驱和后接算法的求解,并掌握将二叉树转换为线索二叉树的算法,即线索化算法。为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"btrechar.h"中的函数的形式给出,并假设该库函数中定义了线索二叉树的相关功能,如显示线索二叉树等。 实验内容 第一题: 按先序次序遍历先序线索二叉树。 实验测试数据基本要求: 第一组数据: full41.cbt 第二组数据: letter.cbt 实验准备: 1:将二叉树的根结点的指针传给函数。 2:判断当前结点是否为先序遍历的最后一个结点,若是则访问完该结点后结束,否则进入3。

2:判断当前结点是否有左子树,若有的话访问完该结点后访问它的左子树,否则访问它的右子树,返回2。 第二题: 按中序次序遍历中序线索二叉树。 实验测试数据基本要求: 第一组数据: full41.cbt 第二组数据: letter.cbt 实验准备: 1:将二叉树的根结点的指针传给函数。 2:判断当前结点是否为中序遍历的最后一个结点,若是则访问完该结点后结束,否则进入3。 3:对于当前结点,先访问该结点的前驱结点并进入第二步,其次访问该结点并进入第二步最后访问该结点的后继结点并进入2。 第三题: 将值为x的结点作为先序线索二叉树T的左子树的(先序)最后一个结点的右孩子插入进去。 实验测试数据基本要求: 第一组数据: full41.cbt 第二组数据: letter.cbt 实验准备: 1:将先序线索二叉树的根结点的指针传给函数。 2:判断当前结点是否为要找的结点P,若是则建立一个新的结点,将新结点作为P的右孩子,并根据新建的结点修改前驱后继关系,否则进入3。 3:指针指向该结点先序遍历的后继,返回2。 第四题: 按中序次序线索化二叉树。 实验测试数据基本要求: 第一组数据: full41.cbt 第二组数据: letter.cbt

线索二叉树

按照某种遍历方式对二叉树进行遍历时,可以把该二叉树中所有节点排列为一个线性序列。在该序列中,除第一个结点外,每个结点有且仅有一个直接前驱;除最后一个节点外,每个结点都有且仅有一个直接后继。但是,当以二叉链表作为存储结构时,只能得到结点的左右孩子的信息,而不能直接得到节点在某种遍历序列中的前驱和后继结点,这种信息只有在对二叉树遍历的动态过程中才能得到。 typedef struct ThBiNode { char data; ThBiNode *lchild,*rchild; int ltag,rtag; }ThBiNode,*ThBiTree; 线索二叉树的基本操作 下面以中序线索二叉树为例。 1.建立中序线索二叉树

这也是对二叉树进行线索化的过程,即在遍历过程中,判断当前顶点的左右指针是否为空。若为空,则改为相应的前驱或者后继的线索。基本思路:设指针pre始终指向刚刚访问过的结点,即pre是当前访问结点的前驱。线索化过程中,访问p所指向的结点时,应作如下处理: 1)建立p的前驱线索。 若p->lchild为空,则将其左标志域置为1,并令p->lchild指向其中序前驱pre。 2)建立pre的后继线索。 若pre->rchild为空,则将其右标志域置为1,并令pre->rchild指向p。3)将pre指向p刚刚访问过的结点,即pre=p。这样,在p访问一个新结点时,pre为其前驱结点。 算法代码如下: void InThreading(ThBiNode *p) { if(p) { InThreading(p->lchild); if(!p->lchild) { p->lchild=pre; p->ltag=1;

中序线索二叉树程序

#include #include #include typedef char ElemType; typedef enum {Link,Thread}PointerTag; typedef struct node{ ElemType element; struct node *left,*right; PointerTag LTag,RTag; }BiThrNode; typedef BiThrNode *BiThrTree; void CreatBinTree(BiThrTree *T) { char ch; if ((ch=getchar())=='.') *T=NULL; else{ *T=(BiThrNode*)malloc(sizeof(BiThrNode)); (*T)->element=ch; (*T)->LTag=Link; (*T)->RTag=Link; CreatBinTree(&(*T)->left); CreatBinTree(&(*T)->right); } } BiThrTree pre; void InThreading(BiThrTree p) { if(p){ InThreading(p->left); if(!p->left){ p->LTag=Thread; p->left=pre; } if(!pre->right){ pre->RTag=Thread; pre->right=p; } pre=p;

InThreading(p->right); } } int InorderTreading(BiThrTree *Thrt,BiThrTree T) { if(!((*Thrt)=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0); (*Thrt)->LTag=Link; (*Thrt)->RTag=Thread; (*Thrt)->right=*Thrt; if(!T) (*Thrt)->left=*Thrt; else{ (*Thrt)->left=T; pre=*Thrt; InThreading(T); pre->right=*Thrt; pre->RTag=Thread; (*Thrt)->right=pre; } } int print(BiThrTree e) {printf("%d %c %d\n",e->LTag,e->element,e->RTag); return 1; } int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e)) { BiThrTree p; p=T->left; while (p!=T) { while (p->LTag==Link) p=p->left; if(!visit(p)) return 0; while(p->RTag==Thread&&p->right!=T){ p=p->right; visit(p); } p=p->right; } }

线索化二叉树的实现

数据结构课程设计 设计说明书 线索二叉树算法的实现 学生姓名XX 学号XXXXXXX 班级XXXXX 成绩 指导教师XXX 计算机科学与技术系 XXXX 年X月X日

数据结构课程设计评阅书 题目线索二叉树算法的实现 学生姓名XX 学号XXXXXXX 指导教师评语及成绩 成绩:教师签名:年月日 答辩教师评语及成绩 成绩:教师签名:年月日 教研室意见 总成绩:室主任签名:年月日注: 指导老师成绩60%,答辩成绩40%,总成绩合成后按五级制计入。

课程设计任务书 2011—2012学年第1学期 专业:计算机科学与技术学号: XXXXXXX 姓名:XXXX 课程设计名称:数据结构课程设计 设计题目:线索二叉树的实现 完成期限:自2011 年 8 月 29 日至 2011 年 9 月 9 日共 2 周 设计内容: n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空 指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这 种附加的指针称为"线索")。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一 棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉 链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或 后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历 过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前 序线索二叉树、中序线索二叉树和后序线索二叉树三种。 运用VC++编写一个程序实现前序线索二叉树、中序线索二叉树和后 序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。 要求: 1)阐述设计思想,画出流程图; 2)任意建立一棵二叉树,采用前序、中序、后序三种方法线索化二叉树; 3)说明测试方法,写出完整的运行结果; 4)从时间、空间对算法分析; 5)较好的界面设计; 6)编写课程设计报告。 以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交 指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后, 经指导老师验收合格后将设计说明书打印装订,并进行答辩。

数据结构二叉树遍历及线索化后各种操作(绝对无错)

实验二二叉树的存储结构及各种运算的实现 第一题: #include "stdio.h" #include "malloc.h" #define maxsize 66 typedef int datatype; typedef struct node { datatype data ; struct node *lchild,*rchild; } bitree; bitree *Q[maxsize]; bitree *creatree() { char ch; int front,rear; bitree *root,*s; root=NULL; front=1;rear=0; ch=getchar(); while (ch!='#') { s=NULL; if(ch!='@') { s=malloc(sizeof(bitree)); s->data=ch; s->lchild=NULL; s->rchild=NULL; } rear++; Q[rear]=s; if(rear==1) root=s; else { if (s&&Q[front]) if(rear%2==0) Q[front]->lchild=s; else Q[front]->rchild=s; if(rear%2==1)

front++; } ch=getchar(); } return root; } preorder(bitree *t) //前{ if (t) { printf(" %c ",t->data); preorder(t->lchild); preorder(t->rchild); } } inorder(bitree *t) //中{ if (t) { inorder(t->lchild); printf(" %c ",t->data); inorder(t->rchild); } } postorder(bitree *t) //后{ if (t) { postorder(t->lchild); postorder(t->rchild); printf(" %c ",t->data); } } int height(bitree *t) //高度{ int hl,hr; if(!t) return 0; else { hl=height(t->lchild); hr=height(t->rchild); return ((hl>hr?hl:hr)+1); } }

相关文档
最新文档