数据结构教学课件5p幻灯片.ppt

  1. 1、本文档共61页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线索二叉链表存储结构的C语言描述如下: typedef char DataType; typedef struct Node { DataType data; struct Node *lchild,*rchild; int ltag,rtag; }BiThrTree; lchild ltag data rtag rchild 一、中序线索二叉树的定义 若线索二叉树的线索中保存的是结点在前序遍历下的前趋和后继的指针,则这种线索称为前序线索;同理,若保存的是中序遍历下的前趋和后继的指针,称为中序线索;若保存的是后序遍历下的前趋和后继的指针,称为后序线索。对应的线索二叉树有前序线索二叉树、中序线索二叉树和后序线索二叉树,线索链表有前序线索链表、中序线索链表和后序线索链表。 若要实现中序线索化的运算,在内存中建立中序线索二叉链表,需要先按照线索树中的结点结构建立二叉链表存储结构,即每个结点的左、右标志域均为0。 在这样的存储结构上进行中序线索化,只要按中序遍历二叉链表,在遍历过程中用线索取代空指针即可。设两个指针,一个指针pre始终指向刚刚访问过的结点,一个指针p指向当前正在访问的结点。具体方法是: (1)若结点*p有空指针域,则将相应的标志域置为1; (2)若结点*p有中序前趋结点*pre(pre!=NULL)则: 1)若结点*pre的右标志为1(pre-rtag = =1),则令pre- rchild为指向其中序后继结点*p的指针(右线索),即pre- rchild=p; 2)若结点*p的左标志为1(p-ltag= =1),则令p- lchild为指向其中序前趋结点*pre的指针(左线索),即p- lchild=pre; (3)将pre指向刚刚访问过的结点*p,即pre=p,保留前趋结点指针。 中序线索化算法的C函数: BiThrTree *pre=NULL; /*全局变量,前趋指针*/ void inthreaded (BiThrTree * p) /* 中序线索化 */ { if(p) { inthreaded(p-lchild); /* 线索化左子树 */ if(p-lchild==NULL) p-ltag=1; /* 根据左右孩子修改当前结点*p的标志域 */ if(p-rchild==NULL) p-rtag=1; if(pre!=NULL) /* 当前结点*p有前趋(只有中序遍历的第一个结点无前趋) */ { if(pre-rtag==1) pre-rchild=p;/* 设置前趋结点*pre的后继 */ if(p-ltag==1) p-lchild=pre; /* 设置当前结点*p的前趋 */ } pre=p; /* 保存刚刚访问的结点指针*/ inthreaded(p-rchild); /* 线索化右子树 */ } } 二、中序线索二叉树上遍历的实现 首先要找到中序遍历的第一个结点(二叉树中最左下点,其左线索为空),然后依次找到该结点的中序后继,直到中序遍历的最后一个结点(其右线索为空),算法结束。 同理,可从中序遍历的最后一个结点出发,依次找该结点的中序前趋,直到中序遍历的第一个结点,算法结束。 在中序线索下查找*p结点的中序后继有两种情况: (1)若*p的右标志为1(p-rtag==1,右子树为空),则p-lchild为右线索,指向*p结点的中序后继; (2)若*p的右标志为0(p-rtag==0,右子树非空),则*p的中序后继为右子树的最左下结点。也就是从*p的右孩子开始,沿左指针往下找,直到找到一个没有左孩子的结点*q(q-ltag= =1),则*q就是*p的中序后继。 中序遍历算法的C函数如下: void InOrderThread(BiThrTree *root) /* 中序线索下的中序遍历 */ { BiThrTree *p; p=root; while(p-ltag==0) p=p-lchild; /* 找中序遍历的第一个结点,二叉树的最左下点 */ while(p) { printf(“%c”,p-data); /* 输出结点 */ if(p-rtag==1) p=p-rchild; /*分两种情况查找结点后继 */ else { p=p-rchild; while(p-ltag==0) p=p-lchild;

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档