线索二叉树的应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书

(数据结构课程设计)

专业:网络工程

课程名称: 数据结构课程设计班级: 网络B11-1

设计题目: 线索二叉树的应用

设计时间: 2013-2-25 至2013-3-8

评语:_________________________________

_________________________________________

_________________________________________

_________________________________________

_________________________________________

评阅成绩:____评阅教师:__

一、问题描述与需求分析

1、问题描述

本实验的问题是建立一个线索二叉树,并实现线索二叉树的插

入、删除、恢复线索等功能。

2、功能需求分析

本程序要实现的功能是: 1. 线索二叉树的建立。

2.线索二叉树的插入。

3.线索二叉树的删除。

4.线索二叉树的恢复。

想要完成上面的功能,我们首先是要知道上面是线索二叉树。我们可以从数据结构的书上找到答案,利用二叉链表的空指针域将空的左孩子指针域改为指向其前驱,空的右孩子指针域改为指向其后继。这种改变指向的指针称为线索,加上了线索的二叉链表称为线索链表。

N个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点的在某种遍历次序下的前驱和后继结点的指针,这种加上了线索的二叉链表称为线索链表。相应的二叉树称为线线索二叉树。根据线索二叉树性质的不同,线索二叉树可以分为前序线索二叉树,中序线索二叉树和后续线索二叉树三种,此次课程设计中使用的是中序线索二叉树。

二、概要设计

1、总体设计思路

首先就是要建立一个二叉树,然后再对二叉树进行线索化。

线索链表中的结点结构为:

其中:

线索二叉树及其存储结构如

在线索树上进行遍历,只需先找到序列中的第一个结点,然后依次找结点后继为空时而止。

以上图为例子说明在线索树中查找结点的后继。树中所有叶子的结点是线索,则右链域直接指示结点的后继,如结点b的后继为结点*。树中所有非终端结点的右链均为指针,则无法由此得到后继的信息。然而根据中序遍历的规律可知,结点的后继应是遍历其右子树时访问的第一个结点,即右子树最左下的结点。列入在找结点*的后继时,首先沿右指针找到其右子树的根结点“—”,然后顺其左指针往下直至其左标志为1的结点,即为结点* 的后继,在图中是结点c。反之,在中序结点中找结点前驱的规律是:若其左标志为“1”,则左链为线索,指示其前驱,否则遍历左子树时最后访问的一个结点(左子树最右下的结点)为其前驱。

程序流程图

2、模块简介

本程序有五个模块功能。每个模块功能均实现特定的功能。

1.二叉树的建立:

中序输入二叉树,为程序提供数据,输入的时候空域用@表示。

2.进行二叉树的线索化:

按中序遍历顺序将二叉树线索化,只需要在遍历的过程中将二叉树的每个结点的空的左右孩子的指针域分别修改为指向其前驱和后继,若其左子树为空,则将其左孩子域线索化,使其左孩子指针lchild指向其后继,并且ltag 置1.

3插入操作:

输入要插入的结点信息,然后再查找要插入结点的位置,插入新结点。

4删除操作,确定要删除的结点,查找出要删除的结点,找到之后会显示ltag和rtag信息。

5输出线索二叉树,输出的线索二叉树为经过处理的二叉树。

三、详细设计

1、数据结构设计

程序采用线索链表做存储结构。程序中有二叉树的建立,插入,删除,恢复线索,这些操作都是基于线索链表作的。

2、算法分析与实现

二叉树的建立:

建立一个二叉树,需要按照某种顺序依次输入二叉树中的结点,且该输入顺序必须隐含结点间的逻辑结构信息。这种建立的方法,按全二叉树的层次顺序,一次输入结点信息建立二叉链表的过程。以@表示空结点,以#表示输入结束的标志,。

一次输入结点信息,若其不是虚结点,则建立一个新结点。若新结点是第一个结点,则令其为跟结点,否则将新结点作为孩子链接到它的父亲结点上。

在函数中设置一个队列,该队列是一个指针类型的数组,保存以输入的结点的地址。使队列指针front指向当前与孩子建立链接的父亲结点,,队尾指针rear指向当前输入的结点。若rear为偶数,则该结点为父结点的左孩子,若rear 为奇数,则为父结点的右孩子。若父结点或孩子结点为虚结点,则无需链接,若父结点与其两个孩子结点链接完毕,则使front指向下一个等待链接的父结点。

算法实现:

Bithptr *Q[maxsize]; //建队为指针类型

Bithptr *CreatTree(){

front=1;rear=0; //置空队

if(ch!='@') //不是虚结点.则建立结点

s=(Bithptr *)malloc(sizeof(Bithptr));

s->data=ch;

s->lchild=NULL;

s->rchild=NULL;

s->rtag=0;

s->ltag=0;

if(s!=NULL&&Q[front]!=NULL) //孩子和双亲结点都不是虚结点

if(rear%2==0) Q[front]->lchild=s;

else Q[front]->rchild=s;

if(rear%2==1)front++; //结点*Q[front]的两个孩子处理完front+1

线索化算法:

线索过程需要按照一定的顺序进行,此次程序使用的是中序遍历,所以线索化也将使用中序线索化。

按照某种遍历顺序将二叉树线索化,只需在遍历的过程中将二叉树的每个结点空的左右孩子的指针分别修改为指向其前驱和后继。若其左右树为空,则将其

相关文档
最新文档