- 1、本文档共118页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线索二叉树的存储表示 typedef enum PointerTag { Link, Thread }; // Link == 0:指针,Thread == 1:线索 typedef struct BiThrNode { TElemType data; struct BiThrNode *lchild, *rchild; // 左右指针 PointerTag LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree; 线索链表的遍历算法(中序找后继法): Status InOrderTraverse_Thr(BiThrTree T, Visit) { p = T - lchild; while (p != T) { while (p - LTag == 0) p = p - lchild; if ( ! Visit(p - data)) return ERROR; while ( p - RTag == 1 p - rchild != T) { p = p - rchild; Visit(p - data); } p = p - rchild; } return OK;} // InOrderTraverse_Thr - + a × b - c d / e f 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 T 按中序建立线索链表(按中序线索化二叉树) 1、若结点没有左子树,则令其左指针指向它的“前驱”并将 左指针类型标志改为 “1”; 2、若结点没有右子树,则令其右指针指向它的“后继”并将 右指针类型标志改为 “1”; 3、为了获取“前驱” 的信息,需要在遍历过 程中添加一个指针 pre, 令其始终指向刚刚访问 过的结点。若指针 p 指 向当前访问的结点,则 pre 指向它的前驱。 - + a × b - c d / e f T Status InOrderThreading(BiThrTree Thrt, BiThrTree T) { if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) exit (OVERFLOW); Thrt-LTag = 0; Thrt-RTag = 1; // 建头结点 Thrt - rchild = Thrt; // 右指针回指 if (!T) Thrt - lchild = Thrt; // 若二叉树空,则左指针回指 else { Thrt - lchild = T; pre = Thrt; InThreading(T); // 中序遍历进行中序线索化 pre- rchild = Thrt; pre- RTag = 1; // 最后一个结点线索化 Thrt - rchild = pre; } return OK;} // InOrderThreading void InThreading(BiThrTree p) { if (p) { InThreading(p- lchild); // 左子树线索化 if (!p- lchild) { p- LTag = 1; p- lchild = pre; } if (!pre- rchild) { pre- RTag = 1; pre- rchild = p; } pre = p; // 保持 pre 指向 p 的前驱 InThreading(p- rchild); } // 右子树线索化 }} // InThreading - + a × b - c d / e f 1 1 1 1 1
文档评论(0)