第6章_树3和二叉树.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章_树3和二叉树

Ⅱ. 求二叉树的深度 算法基本思想: 从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加 1。 “访问结点(visit)” 的操作为:求得左、右子树深度的最大值,然后加 1 。 遍历顺序为:后序。 首先分析二叉树的深度和它子树深度之间的关系: int Depth( BiTree T ) { if( !T ) depthval = 0; else { depthL = Depth( T-lchild ); depthR = Depth( T-rchild ); depthval = 1 + (depthL depthR? depthL : depthR ); } return depthval; } // Depth Ⅲ. 二叉树的创建 以字符串的形式输入二叉树:按照二叉树先序遍历的顺序输入二叉树中每个结点的元素。空结点也必须输入。 空树以空格字符“□”表示; 只含一个根结点的二叉树 :以字符串“A□□”表示; 例6-9 以字符串“AB□C□□D□□”表示二叉树 T A (B (□C (□□)) D (□□)) Status CreateBiTree( BiTree T ) { scanf( ch ); if( ch == ) T = NULL; else { if( !(T = (BiTNode *) malloc(sizeof(BiTNode))) ) exit( OVERFLOW ); T-data = ch; CreateBiTree( T-lchild ); // 构造左子树 CreateBiTree( T-rchild ); // 构造右子树 } return OK; } // CreateBiTree 三. 线索二叉树 Ⅰ. 何谓线索二叉树? 遍历二叉树的结果是结点的一个线性序列。 先序序列: 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 B D C A H G K F E 遍历序列中表示线性关系指针称为“线索”。 在二叉链表的结点中增加两个标志域,并作如下规定: 1)若该结点的左子树不空,则 lchild 指针指向其左子树,且左标志的值为 0;否则,lchild 指针指向其前驱,且左标志的值为 1。 2)若该结点的右子树不空,则 rchild 指针指向其右子树,且右标志域的值为 0;否则,rchild 指针指向其后继,且右标志的值为 1。 lchild LTag data RTag rchild 线索链表的 C 语言描述: typedef enum { Link, Thread } PointerThr; // Link=0:指针,Thread=1:线索 typedef struct BiThrNod { TElemType data; struct BiThrNode *lchild, *rchild; // 左右指针 PointerThr LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree; 以这种结点定义的二叉树的存储结构称作“线索链表”。 其二叉树称为“线索二叉树”。 在线索链表中定义头结点,其 lchild 指向二叉树的根结点,LTag 为 0;rchild 指向遍历序列中的最后一个结点,RTag 为 1。 对二叉树进行遍历,使其变为线索二叉树的过程叫做“线索化”。 遍历序列中首结点的 lchild 指向头结点,尾结点的 rchild 指向头结点。 Ⅱ. 线索链表的遍历算法: 例如: 对中序线索链表的遍历算法 ※ 中序遍历的第一个结点 ? 左子树上最“左边的”没有左子树的结点。 ※ 在中序线索链表中结点的后继 ? 若无右子树,则为后继线索所指结点; 否则为其右子树进行中序遍历访问的第一个结点。 void InOrder_Thr( BiThrTree T, void (*Visit)(TElemType e) ) { // 遍历头结点为 T 的中序线索链表 p = T-lchild; // p 指向根结点 while( p != T ) { // 最后一个结点的 rchild 指向 T while( p-LTag == Link ) p = p-lchild; // 第一个结点 (*Visit)( p-data ); while( p-RTag =

文档评论(0)

feixiang2017 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档