- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
浅谈线索二叉树
摘要:数据结构中二叉树有很多的遍历算法,但本质都是将属性结构转换为线性序列,简化问题。在遍历序列中,每个节点都有自己的前驱和后去,但在二叉树遍历过程中寻求答案却因为时间复杂度等因素使操作效率低下。线索二叉树很好地解决了这一问题,本文是在二叉树的基础上加入线索二又树实现数据的快速可操作性。
关键词:数据结构;线索二叉树;应用
前言
为了实现在遍历序列中快速查找节点的前驱、后继,利用二叉链表中空的指针域,指向结点在遍历序列中的前驱、后继,这些指向前驱、后继的指针就是线索。
1、数据结构
数据结构起源于程序设计,主要是计算机中数据的组织方式、存储结构和处理方法。在程序的编程中,写一个“好”的程序,就是要选择一个合理的数据结构和算法。数据的逻辑
结构常用结构图来描述,将每一个数据元素看做一个结点,在计算处理数据的时候,算法同样很关键。一种算法的有穷性,必须对任何合法的输入在执行有穷之后结束,并且每1步都在有穷时间内完成。树形结构就是用于有层次关系的数据表示,表达大多数问题求解的思路,而二叉树的结点数和深度,为二叉树存储结构的选择提供了预备知识和思考线索。线索二又树借助二又树遍历的程序框架建立,通过函数将整个二叉树的线索化分解,求后继、前驱结点的算法增加数据操作的效率,缩短时间,提高数据的操作性。
2、树的结构定义
树形结构是信息的重要组织形式之一,树是一种数据结构,它是由n(n=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像1棵倒挂的树,也就是说它是根朝上,而叶朝下的。
它具有以下的特点:
(1)每个结点有零个或多个子结点;
(2)每一个子结点只有一个父结点;
(3)没有前驱的结点为根结点;
(4)除了根结点外,每个子结点可以分为多个不相交的子树。
树的应用非常广泛,在程序设计中实现通用树的基本功能需要考虑很多功能,比如内存分配,添加节点,修改节点,删除节点,移动节点,遍历,查询,保存,读取问题。STL提供了丰富容器,非常遗憾地是没有提供树。不过使用STL可以非常方便地实现1棵通用树,完全可以避免直接使用内存分配函数和遍历释放内存。
3、线索二又树的实现和建立
运用Vc++编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现,通过线索二叉树提高数据操作效率。线索二叉树建立与中序遍历的c语言实现程序如下:
#includestdio.h
#includemalloc.h
Typedefenum{Link,Thread}PointerTag;//指针标志
typedefintDataType;
typedefstructBiThreTreef//定义结点元素
PointerTagLTag,RTag;
DataTypedata;
struetBiThreTree*lehild,*rchild;
}BiThreTree;
BiThreTree*pre;//全局变量,用于二叉树的线索化BiThre-
Tree*CreateTree()//按前序输入建立二叉树
{
BiThreTree*T:
DataTypee:
Scanf(“%d”,e);
If(e==0)
T=NULL;
Else
{T=(BiThreTree*)malloc(sizeof(BiThreTree));
T-data=e;
T-LTag=Link;//初始化时指针标志均为Link
T-RTag=Link;
T-lchild=CreateTree();
T-rchild=CreateTree();
}
returnT:
}
voidInThread(BiThreTree*T)
{
BiThreTree*p;
p=T;
if(p)
{
InThread(p-lchild);
if(!p-lchild)
{p-LTag=Thread;
p-lchild=pre;
}
if(!pre-rehild)
{pre-RTag=Thread;
pre-rchild=p;
}
Pre=p;
InThread(p-rehild);
}
}
BiThreTree*InOrderThrTree(BiThreTree*T)//中序线索化二叉树
{
BiThreTree*Thre;//Thre为头结点的指针
Thre=(BiThreTree)malloc(sizeof(BiThreTree));
对与数据线索二叉树的插征和性能进行了一个笼统的分析,线索二叉树通过设置Ltag,Rtag标志,并事先线索化来提高整个二叉树的遍历速度,是个典型的通过牺牲空间来提升速度例子。但
文档评论(0)