线索二叉树 怼烎@ 2022-06-14 03:48 183阅读 0赞 # 1.基本概念 # # 对于某些二叉树而言,其指针域的空间不能被充分利用。因此我们可以考虑利用那些空的指针域来存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前驱和后继的指针称为**线索**,加上线索的二叉链表称为**线索链表**,对应的二叉树就称为**线索二叉树**。 我们对二叉树以某种次序遍历使其变为线索二叉树的过程称作是**线索化**。线索化的过程就是在遍历二叉树时修改结点空指针的过程。 2.线索二叉树的存储结构 # 为区别某一节点的lchild指针是指向它的左孩子还是指向前驱,rchild指针是指向它的右孩子还是后继?我们可以分别设置一个**ltag**标志和一个**rtag**标志。当标志变量值为0时,表明此时对应的指针指向结点的孩子,而当标志变量值为1时,表明此时对应的指针指向某次遍历的前驱或后继。 //线索二叉树的存储结构定义 typedef int TElemType; //元素的数据类型根据实际情况而定,这里假设为int typedef struct Node //结点结构 { TElemType data; //数据域,用于存储结点数据 struct Node *lchild; //指针,指向该结点的左孩子或前驱 struct Node *rchild; //指针,指向该结点的右孩子或后继 int ltag,rtag; //标志,指示指针指向左右孩子还是前驱后继 }BiThrNode,*BiThrTree; # 3.线索二叉树的建立 # 在此以中序遍历和先序遍历为例建立线索二叉树 BiThrTree pre=NULL; //全局变量,始终指向访问的前一个结点 //中序线索化 void InThreading(BiThrTree p) { if (p) { InThreading(p->lchild); if (!p->lchild) //如果当前结点的左孩子不存在,则修改当前结点的左标志,并使其左指针指向前一个结点 { p->ltag=1; p->lchild=pre; } if ((pre!=NULL) && (!pre->rchild)) //如果前一个结点的右孩子不存在,则修改前一个结点的右标志,并使其右指针指向当前结点 { pre->rtag=1; pre->rchild=p; } pre=p; //将当前结点定义为前一个结点,为下一轮作准备 InThreading(p->rchild); } } BiThrTree pre=NULL; //全局变量,始终指向访问的前一个结点 //先序线索化 void PreThreading(BiThrTree p) { if (p) { if(!p->lchild) { p->ltag=1; p->lchild=pre; } if ((pre!=NULL) && (!pre->rchild)) { pre->rtag=1; pre->rchild=p; } pre=p; if (p->ltag!=1) PreThreading(p->lchild); if (p->rtag!=1) PreThreading(p->rchild); } } # 4.线索二叉树的遍历 # 中序遍历: void InOrderTraverse(BiThrTree T) { BiThrTree p; p=T; while(p) //树空或已经到最后一个结点时停止循环 { while(p->ltag!=1) //遍历左子树,直到一个没有左孩子的结点 { p=p->lchild; } printf("%d",p->data); //打印该结点 while(p->rtag==1) //如果当前结点有后继,则直接访问后继结点 { p=p->rchild; printf("%d",p->data); } p=p->rchild; //如果当前结点没有后继时,进入其右子树 } } 先序遍历: void PreOrderTraverse(BiThrTree T) { BiThrTree p; p=T; while (p) //树空或已经到最后一个结点时停止循环 { printf("%d",p->data); //打印结点 if (p->ltag!=1) //当前结点的左孩子存在时,下一个结点为左孩子 { p=p->lchild; }else //若左孩子不存在,则下一个结点为当前结点的右孩子 { //若右孩子也不存在,则下一个结点为当前结点的后继 p=p->rchild; } } } # 5.代码验证 # int main() { BiThrTree T; printf("按先序遍历建立线索二叉树:\n"); CreateBiTree(&T); //创建树T PreThreading(T); //先序线索化T printf("\n线索二叉树的先序遍历:\n"); PreOrderTraverse(T); //遍历T return 0; } ![这里写图片描述][format_png] int main() { BiThrTree T; printf("\n按先序遍历建立线索二叉树:\n"); CreateBiTree(&T); //创建树T InThreading(T); //中序线索化T printf("\n线索二叉树的中序遍历:\n"); InOrderTraverse(T); //遍历T return 0; } ![这里写图片描述][format_png 1] -------------------- 如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!! ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqd19weXRob24_size_16_color_FFFFFF_t_70_pic_center] [format_png]: /images/20220614/4482b7bf66dc4492b19dca4c4587b901.png [format_png 1]: /images/20220614/ed8e86122c434c98b6e49c239ba5ffe1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pqd19weXRob24_size_16_color_FFFFFF_t_70_pic_center]: /images/20220614/2086b07e764d4dbaae5e34f59c9b2db6.png
相关 线索二叉树 1.基本概念 对于某些二叉树而言,其指针域的空间不能被充分利用。因此我们可以考虑利用那些空的指针域来存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前 怼烎@/ 2022年06月14日 03:48/ 0 赞/ 184 阅读
相关 线索二叉树 使用二叉树作为存储结构时,只能找到结点的左、右孩子的信息,而不能直接得到结点的前驱和后继的信息; 在有n个结点的二叉树中有n+1个空指针,利用这n+1个空指保存前驱和后继的信 小灰灰/ 2022年06月10日 06:18/ 0 赞/ 240 阅读
相关 线索二叉树 线索化二叉树相对于之前的树的遍历,在树的定义上增加了两个值,一个是ltag,另外一个是rtag。 ltag代表着这个节点的是否有右孩子,如果有,则ltag=1,p->lchi 以你之姓@/ 2022年06月09日 01:13/ 0 赞/ 212 阅读
相关 线索二叉树 在找线索二叉树的过程中,这篇博客很值得推荐;[http://waret.iteye.com/blog/709779][http_waret.iteye.com_blog_709 我就是我/ 2022年06月04日 03:21/ 0 赞/ 219 阅读
相关 线索二叉树 二叉树的链式存储如下图, ![Image 1][] 不难发现,图中所示的左—右指针表示中,有一半以上的指针是空的。事实上,所有包括n个结点的二叉树的这种表示中,每个结 秒速五厘米/ 2022年05月29日 00:18/ 0 赞/ 181 阅读
相关 线索二叉树 线索二叉树提出的原因: 在普通二叉树中,每个结点都有左右两个指针域,这些指针域都指向结点类型的数据对象,当二叉树稀疏时,很多结点的左右两个指针域就显得浪费存储空间了。因此,提 待我称王封你为后i/ 2022年03月15日 13:24/ 0 赞/ 272 阅读
相关 线索二叉树 本文主要介绍线索二叉树和树、二叉树、森林三者之间的相互转换。 对于线索二叉树,这里只做简单介绍,着重还是要理解上篇博文中二叉树的各种遍历算法。 线索二叉树 基本概念 旧城等待,/ 2022年02月23日 08:36/ 0 赞/ 243 阅读
相关 线索二叉树 什么是线索二叉树? 遍历二叉树是以一定的规则将二叉树中的结点排列成一个线性序列,从而等到二叉树的各种遍历序列,其实质是对一个非线性操作进行线性化操作,使这个访问序列中的每 女爷i/ 2022年01月23日 08:15/ 0 赞/ 273 阅读
相关 线索二叉树 package com.tree; import java.util.concurrent.SynchronousQueue; / 红太狼/ 2021年10月15日 02:37/ 0 赞/ 320 阅读
相关 线索二叉树 Overview 将二叉树中没有子节点的节点称为空指针域,利用二叉树的空指针域,按照前中后某种遍历方式存放对应的前驱节点,后驱节点(这种附加指针称为“线索”)。二叉树的空 矫情吗;*/ 2021年10月01日 09:34/ 0 赞/ 370 阅读
还没有评论,来说两句吧...