《数据结构》-二叉树的线索化_第1页
《数据结构》-二叉树的线索化_第2页
《数据结构》-二叉树的线索化_第3页
《数据结构》-二叉树的线索化_第4页
《数据结构》-二叉树的线索化_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.1 树的定义和基本术语,6.2 二叉树,6.3 遍历二叉树和线索二叉树,6.4 树和森林,6.6 哈夫曼树及其应用,第六章 树和二叉树,何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表?,6.3.2 二叉树的线索化,6.3 遍历二叉树和线索二叉树,一、何谓线索二叉树?,遍历二叉树的结果是, 求得结点的一个线性序列。,A,B,C,D,E,F,G,H,K,例如:,先序序列: A B C D E F G H K,中序序列: B D C A H G K F E,后序序列: D C B H K G F E A,指向该线性序列中的“前驱”和 “后继” 的指针,称作“线索”,与其相应的二叉树,称作 “线索二叉树”,包含 “线索” 的存储结构,称作 “线索链表”,A B C D E F G H K, D ,C , B,E ,对线索链表中结点的约定:,在二叉链表的结点中增加两个标志域,并作如下规定:,若该结点的左子树不空,则Lchild域的指针指向其左子树, 且左标志域的值为“指针 Link”; 否则,Lchild域的指针指向其“前驱”, 且左标志的值为“线索 Thread” 。,若该结点的右子树不空,则rchild域的指针指向其右子树, 且右标志域的值为 “指针 Link”;否则,rchild域的指针指向其“后继”, 且右标志的值为“线索 Thread”。,如此定义的二叉树的存储结构称作“线索链表”,6.3.2 二叉树的线索化,当以二叉链表作为存储结构时,只能找到结点的左、右孩子信息,而不能直接得到结点在任一序列(先序、中序或后序序列)中的前驱和后继信息,这种信息只有在遍历的动态过程中才能得到。为了保存这种在遍历过程中得到的信息,我们利用二叉链表中的空链域(由于结点没有左子树或右子树),来存放结点的前驱和后继信息。,作如下规定: 若结点有左子树,则其lchild域指示其左孩子,否则令lchild域指示其前驱; 若结点有右子树,则其rchild域指示其右孩子,否则令rchild域指示其后继。,(1)线索链表的结点结构,其中:data:数据域; lchild:左指针域,指向该结点的左孩子; rchild:右指针域,指向该结点的右孩子;,(2)线索链表的定义 线索链表:以上述结点结构构成的二叉链表作为二叉树的存储结构,称之为线索链表。,(3)相关术语,线索化:对二叉树以某种次序遍历使其变为线性二叉树的过程。,线索二叉树(Threaded Binary Tree):加上线索的二叉树。,线索:在线索链表中指向结点前驱和后继的指针。,(4)图形表示,(a) ( a + b * (cd)e / f )表达式的二叉树,(b) 中序线索二叉树,图6.11线索二叉树及其存储结构,(c) 中序线索链表,图中,实线为指针(指向左、右子树),虚线为线索(指向前驱和后继)。,typedef struct BiThrNod TElemType data; struct BiThrNode *lchild, *rchild; / 左右指针 PointerThr LTag, RTag; / 左右标志 BiThrNode, *BiThrTree;,线索链表的类型描述:,typedef enum Link, Thread PointerThr; / Link=0:指针,Thread=1:线索,二、线索链表的遍历算法:,for ( p = firstNode(T); p; p = Succ(p) ) Visit (p);,由于在线索链表中添加了遍历中得到的“前驱”和“后继”的信息,从而简化了遍历的算法。,例如: 对中序线索化链表的遍历算法, 中序遍历的第一个结点 ?, 在中序线索化链表中结点的后继 ?,左子树上处于“最左下”(没有左子树)的结点,若无右子树,则为后继线索所指结点,否则为对其右子树进行中序遍历时访问的第一个结点,void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e) /T指向结点,头结点的左链lchild指向根结点,可参照线索化算法。/中序遍历二叉线索树T的非递归算法,对每个数据元素调用函数visit p = T-lchild; / p指向根结点 while (p != T) / 空树或遍历结束时,p=T while (p-LTag=Link) p = p-lchild; / 第一个结点 if (!visit(p-data) return ERROR;/访问其左子树为空的结点 while (p-RTag=Thread / p进至其右子树根 / InOrderTraverse_Thr,在中序遍历过程中修改结点的左、右指针域,以保存当前访问结点的“前驱”和“后继”信息。遍历过程中,附设指针pre, 并始终保持指针pre指向当前访问的、指针p所指结点的前驱。,三、如何建立线索链表?,void InThreading(BiThrTree p) if (p) / 对以p为根的非空二叉树进行线索化 InThreading(p-lchild); / 左子树线索化 if (!p-lchild) / 建前驱线索 p-LTag = Thread; p-lchild = pre; if (!pre-rchild) / 建后继线索 pre-RTag = Thread; pre-rchild = p; pre = p; / 保持 pre 指向 p 的前驱 InThreading(p-rchild); / 右子树线索化 / if / InThreading,Status InOrderThreading(BiThrTree / InOrderThreading, ,if (!T) Thrt-lchild =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论