- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.5 线索二叉树.ppt
一旦建立了某种方式的线索二叉树后,用户程序就可以像操作双向链表一样操作该线索二叉树。 例如,一旦建立了中序线索二叉树后,用户程序就可以设计一个正向循环结构遍历该二叉树的所有结点,循环初始定位在中序线索二叉树的第一个结点位置,每次循环使指针指向当前结点的中序遍历的后继结点位置,当指针指向中序线索二叉树的最后一个结点位置后循环过程结束;或者用户程序可以设计一个反向循环结构遍历该二叉树的所有结点,循环初始定位在中序线索二叉树的最后一个结点位置,每次循环使指针指向当前结点的中序遍历的前驱结点位置,当指针指向中序线索二叉树的第一个结点位置前循环过程结束。 这种算法设计要求分别设计三个函数: First():定位在第一个结点位置; Next():移动到下一个结点位置; End():是否已经到最后下一个结点位置; 当然,还需要一个根据二叉树构造线索二叉树的函数。 2.二叉树还原为树 二叉树还原为树的方法是: (1)若某结点是其双亲结点的左孩子,则把该结点的右孩子、右孩子的右孩子……都与该结点的双亲结点用线连起来。 (2)删除原二叉树中所有双亲结点与右孩子结点的连线。 (3)整理所有保留的和添加的连线,使每个结点的所有孩子结点位于相同层次高度。 二叉树还原为树的过程 (a)二叉树;(b)双亲与非第一个孩子加连线; (c)删除结点与右孩子连线;(d)树 A B E F C D G A B E F C D G A B E F C D G A B C D E F G ( a ) ( b ) ( c ) ( d ) * * 7.5 线索二叉树 线索二叉树是另一种分步遍历二叉树的方法。它既可以从前向后分步遍历二叉树,又可以从后向前分步遍历二叉树。 当按某种规则遍历二叉树时,保存遍历时得到的结点的后继结点信息和前驱结点信息的最常用的方法是建立线索二叉树。 对二叉链存储结构的二叉树分析可知,在有n个结点的二叉树中必定存在n+1个空链域。 规定:当某结点的左指针为空时,令该指针指向按某种方法遍历二叉树时得到的该结点的前驱结点;当某结点的右指针为空时,令该指针指向按某种方法遍历二叉树时得到的该结点的后继结点。仅仅这样做会使我们不能区分左指针指向的结点到底是左孩子结点还是前驱结点,右指针指向的结点到底是右孩子结点还是后继结点。因此我们再在结点中增加两个线索标志位来区分这两种情况。线索标志位定义如下: 每个结点的结构就如下所示: leftThread leftChild data rightChild rightThread 结点中指向前驱结点和后继结点的指针称为线索。在二叉树的结点上加上线索的二叉树称作线索二叉树。对二叉树以某种方法(如前序、中序或后序方法)遍历使其变为线索二叉树的过程称作按该方法对二叉树进行的线索化。 A D G E C F (a) B 0 1 0 A 0 0 B 1 0 C 0 1 D 0 1 E 1 1 F 1 1 G 1 (b) 0 1 0 A 0 0 B 1 0 C 0 1 D 0 1 E 1 1 F 1 1 G 1 (d) 0 1 0 A 0 0 B 1 0 C 0 1 D 0 1 E 1 1 F 1 1 G 1 (c) root root root 线索二叉树 typedef struct { ThreadBiNode *root; ThreadBiNode *current; int nextComplete; }ThreadBiTree; void ThreadInitiate(ThreadBiTree *tree, ThreadBiNode *root) { tree-root = root; tree-current = root; if(root == NULL) tree-nextComplete = 1; else tree-nextComplete = 0; } void First(ThreadBiTree *tree) { tree-current = tree-root; while(tree-current-leftThread == 0) tree-current = tree-current-leftChild; ? if(tree-current == tree-root) tree-nextComplete = 1; else tree-nextComplete = 0; } ? void Next(ThreadBiTree *tree) { ThreadBiNode *p = tree-current-rightChild; if(tree-nextComplete == 1) return; if(tree-cu
您可能关注的文档
最近下载
- 万科-平衡计分卡-经典案例讲解.docx
- 2023年福建省计算机专项考评员试题.docx VIP
- 2025年粮食日主题班会《“知食分子”不剩饭》【课件】.pptx VIP
- 马达加斯加共和国TheRepublicofMadagascar.PDF VIP
- 微软云存储OneDrive 入门.pdf VIP
- 新版人教版三年级上册数学全册教案教学设计含教学反思 .pdf
- 《外科护理学》课件—— 急性阑尾炎病因和发病机制.pptx VIP
- GB/T19580 《卓越绩效评价准则》国家标准培训讲义.pdf VIP
- 2025广西盐业集团玉林盐业有限公司招聘笔试备考题库及答案详解(历年真题).docx
- 《单片机基础与Arduino应用(第2版)》全套教学课件.pptx
文档评论(0)