第六章 西北大学树和二叉树.ppt

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

RChild Rtag Data Ltag LChild 为了区分孩子结点和前驱、后继结点,为结点结构增设两个标志域,如下图所示: 其中: Ltag 0 LChild域指示结点的左孩子 1 LChild域指示结点的遍历前驱 Rtag 0 RChild域指示结点的右孩子 1 RChild域指示结点的遍历后继 线索:在这种存储结构中,指向前驱和后继结点的指针叫做线索。 线索链表:以这种结构组成的二叉链表作为二叉树的存储结构,叫做线索链表。 线索化:对二叉树以某种次序进行遍历并且加上线索的过程叫做线索化。 线索二叉树:线索化了的二叉树称为线索二叉树。 2. 二叉树的线索化 【算法思想】 (1)中序线索化采用中序递归遍历算法框架。 (2)加线索操作就是访问结点操作。 (3)加线索操作需要利用刚访问过结点与当前结点的关系,因此设置一个指针pre,始终记录刚访问过的结点,其操作如下: ①如果当前遍历结点root的左子域为空,则让左子域指向pre ; ②如果前驱pre的右子域为空,则让右子域指向当前遍历结点root; ③为下次做准备,当前访问结点root作为下一个访问结点的前驱pre。 void Inthread BiTree root /* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL* / if root! NULL Inthread root- LChild ; /* 线索化左子树 */ if root- LChild NULL root- Ltag 1; root- LChile pre; / *置前驱线索 */ if pre! NULL pre- RChild NULL /* 置后继线索 */ pre- RChild root; pre- Rtag 1; pre root;/ /*当前访问结点为下一个访问结点的前驱*/ Inthread root- RChild ; /*线索化右子树*/ 【算法描述】 3.在线索二叉树中找前驱、后继结点 1 找结点的中序前驱结点 【算法描述】 BiTNode * InPre BiTNode * p /* 在中序线索二叉树中查找p的中序前驱, 并用pre指针返回结果 */ if p- Ltag 1 pre p- LChild; /*直接利用线索*/ else /* 在p的左子树中查找“最右下端”结点 */ for q p- LChild;q- Rtag 0;q q- RChild ; pre q; return pre ; 下面是对同一棵二叉树的遍历方法不同得到的不同线索树。 NULL a 二叉树 A B C D G E F H b 先序线索二叉树 A B C D G E F H NULL NULL (c)中序线索二叉树 A B C D G E F H (d)后序线索二叉树 NULL A B C D G E F H 2 在中序线索树中找结点后继 对于结点p,若要找其后继结点,当p- Rtag 1时,p- RChild即为p的后继结点;当p- Rtag 0时,说明p有右子树,此时p的中序后继结点即为其右子树的“最左下端”的结点。其查找算法如下: 【算法描述】 BiTNode * InNext BiTNode * p /*在中序线索二叉树中查找p的中序后继结点,并用Next指针返回结果*/ if p- Rtag 1 Next p- RChild; /*直接利用线索*/ else /*在p的右子树中查找“最左下端”结点*/ for q p- RChild; q- Ltag 0 ;q q- LChild ; Next q; return Next 4.遍历中序线索树 1 在中序线索树上求中序遍历的第一个结点 【算法描述】 BiTNode * InFirst BiTree Bt BiTNode *p Bt; If !p return NULL ; while p- LTag 0 p p- Lchild; return p; 2 遍历中序二叉线索树 【算法描述】 void TInOrder BiTree Bt BITNode *p; P InFirst Bt ; While p Visit p ; p InNext p ; 5. 线索二叉树的插入、删除运算 二叉树加上线索之后,当插入或删除一结点时,可能会破坏原树的线索。所以在线索二叉树中插入或删除结点的难点在于:插入一个结点后,仍要保持正确的线索。 我们主要以中序线索二叉树为例,说明线索二叉树的插入和删除运算。 (1)插入结点运算

文档评论(0)

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

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

1亿VIP精品文档

相关文档