- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 树与二叉树_2
6.3.2 线索二叉树 为识别复用的两种不同信息,特增加两个标志域: 1. 有关线索二叉树的几个术语: 例:带了两个标志的某先序遍历结果如下表所示,请画出对应的二叉树。 例1:画出以下二叉树对应的中序线索二叉树。 例2:给定如图所示二叉树T,请画出与其对应的中序线索二叉树。 线索二叉树的生成算法(递归算法见教材P134-135) typedef enum PointerType{ Link=0, Thread=1 }; // 定义指针类型,以 Link 表示指针,Thread 表示线索 typedef struct BiThrNode{ ElemType data; struct BiThrNode *Lchild, *Rchild; //左右指针 PointerType LTag, RTag; // 左右指针类型标志 } *BiThrTree; 在线索链表中添加了一个“头结点”,头结点的左指针指向二叉树的根结点,其右线索指向中序序列中的最后一个结点 ltag=0, lchild指向根结点 rtag=1, rchild指向遍历序列中最后一个结点 遍历序列中第一个结点的lchild域和最后一个结点的rchild域都指向头结点 建立一棵中序线索化二叉树 3. 线索二叉树的遍历(无需堆栈) 附:中序线索二叉树遍历步骤 (算法6.5): 算法流程: 算法流程: 有后继找后继 return OK; p=T-lchild; p!=T p-LTag==0 p=p-lchild; visit(p-data); p-RTag==1p-rchild!=T p=p-rchild;visit(p-data); p=p-rchild; Y N Y N Y N 先找最左子孙 找到最左子孙 无后继找右子树的最左子孙 根结点 p==T 空树或遍历结束 (4) return OK; p=T-lchild; p!=T p-LTag==0 p=p-lchild; visit(p-data); p-RTag==1p-rchild!=T p=p-rchild;visit(p-data); p=p-rchild; Y N Y N Y N (1) (3) (5) 根结点 (2) 第六章?? 树和二叉树 作业 6.1 6.5 6.8 6.15 6.19 6.20 6.21 6.23 6.24 6.26 6.27 6.28 T为头结点 p!=T p-rchild!=T用来判断是否结束 T为头结点 p!=T p-rchild!=T用来判断是否结束 * * * * * * * * * * * 所以, 空指针数目=2n-(n-1)=n+1个。 证明:用二叉链表存储包含n个结点的二叉树,结点必有2n个链域(见二叉链表数据类型说明)。 除根结点外,二叉树中每一个结点有且仅有一个双亲,意即每个结点地址占用了双亲的一个直接后继,n个结点地址共占用了n-1个双亲的指针域。也就是说,只会有n-1个结点的链域存放指针。 Threaded Binary Tree 讨论:用二叉链表法(l_child, r_child)存储包含n个结点的二叉树,结点的指针区域中会有多少个空指针? 有n+1个! 思考:二叉链表空间效率这么低,能否利用这些空闲区存放有用的信息或线索? ——我们可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。 结论:用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针。 n(k-1)+1 这就是线索二叉树(Threaded Binary Tree) 用二叉链表法存储包含n个结点的二叉树,结点的指针区域中会有n+1个空指针。 可以用它来存放当前结点的直接前驱和后继等线索,以加快查找速度。这就是线索二叉树的意义和用途。 疑问1:二叉树是1:2的非线性结构,如何定义其惟一的直接后继? 答:要遍历之后才能得到,且不同遍历算法得到的后继也不同。 先依遍历规则把每个结点对应的前驱或后继线索预存起来,这叫做“线索化”。 疑问2:获得这种“直接前驱”或“直接后继”有何意义? 答:从任一结点出发都能快速找到其前驱和后继,且不必借助堆栈 疑问3:如何经济的(预先)存放这类信息? 答:左孩子/前驱复用,右孩子/后继复用,后者称之为线索 ① 每个结点增加两个域:fwd和bwd; 存放前驱指针 存放后继指针 如何预存这类信息?有两种解决方法: ② 与原有的左右孩子指针域“复用”,充分利用那n+1个空链域。 规 定: 1)若结点有左子树,则lchild指向其左孩子; 否则, lchild指向其直
文档评论(0)