[信息与通信]数据结构.ppt

  1. 1、本文档共123页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[信息与通信]数据结构

第六章 树;6.1树的定义和基本术语 ;6.1.1树的定义;6.1.2 树的基本术语 ;6.1.2 树的基本术语; 6.2 二叉树 6.2.1 二叉树的定义;;6.2.1 二叉树的定义;6.2.1 二叉树的定义;6.2.1 二叉树的定义;6.2.1 二叉树的定义;;6.2.2 二叉树的性质 ;6.2.2 二叉树的性质 ;6.2.2 二叉树的性质 ;6.2.2 二叉树的性质;;6.2.2 二叉树的性质;;6.2.3 二叉树的存储结构 ;例如,图6-3(a)所示的满二叉树的顺序存储如图6-4 所示。从图6-4可以发现结点的编号恰好与数组元素的下标相对应。如果满二叉树存放在一维数组中t中,可以方便地由某结点t[i]的下标i找到它们的双亲结点t[i/2],或左、右孩子结点t[2i]、t[2i+1]。 ;6.2.3 二叉树的存储结构 ;6.2.3 二叉树的存储结构 ;;6.2.3 二叉树的存储结构;6.2.3 二叉树的存储结构;6.2.3 二叉树的存储结构;图6-7 二叉树的链表存储结构;6.2.3 二叉树的存储结构;6.2.3 二叉树的存储结构;二叉树声明; 6.3二叉树的遍历 ;6.3 二叉树的遍历 ;6.3.1 先序遍历 ;先序遍历二叉树的递归算法如下: ;6.3.2 中序遍历 ;中序遍历二叉树的递归算法如下: ;6.3.3 后序遍历 ;后序遍历二叉树的递归算法如下: ;6.3.4 由遍历序列恢复二叉树;6.3.4 由遍历序列恢复二叉树;图6-8;6.3.4 由遍历序列恢复二叉树;;;;;;先序遍历的非递归算法;6.4 线索二叉树;问题的提出: 当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能在结点的任一序列的前驱与后继信息,这种信息只有在遍历的动态过程中才能得到。 解决办法: 利用二叉链表中的空指针 增加标志域 效果: 为二叉树建立了一个双向线索链表 ;一、何谓线索二叉树?;指向该线性序列中的“前驱”和 “后继” 的指针,称作“线索”;对线索链表中结点的约定:;若该结点的右子树不空, 则rchild域的指针指向其右子树, 且右标志域的值为 “指针 Link”或0; 否则,rchild域的指针指向其“后继”, 且右标志的值为“线索 Thread”或1。 ;线索链表的结点结构;typedef struct BiThrNod { TElemType data; struct BiThrNode *lchild, *rchild; // 左右指针 PointerThr LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree;;ABCDEFGHI;二、线索链表的遍历算法:;要点;void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e)) { p = T; // p指向根结点 while (p != Null) { // 空树或遍历结束时,p==Null while (p-LTag==Link) p = p-lchild; // 第一个结点 Visit(p-data); while (p-RTag==Thread p-rchild!=T) { p = p-rchild; Visit(p-data); } // 访问后继结点 p = p-rchild; // p进至其右子树根 } } // InOrderTraverse_Thr;有关线索二叉树的几个术语:;二叉树线索化,实质上就是在遍历过程中,检查当前结点的左、右指针域是否为空,如果为空,将它们改为指向前驱结点或后继结点的线索。 遍历过程中,附设指针pre, 始终保持指针pre指向当前访问的、指针p所指结点的前驱。;线索化算法中,访问p所指的结点时,所做的处理如下: 1)建立p的前驱线索 若p-lchild为空,则将其左标志域置1,并令 p-lchild指向其中序前驱pre; 2)建立pre的后继线索 若pre- rchild为空,则将其右标志域置1,并令pre-rchild指向其中序后继p; 3)将pre指向p刚刚访问过的结点,即pre=p。这样,在p访问一个新结点时,pre为其前驱结点 .;void InThreading(BiThrTree p) { if (p) { // 对以p为根的非空二叉树进行线索化 InThreading(p-lchild); // 左子树线索化 if (p-lchild

文档评论(0)

jiupshaieuk12 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档