- 1、本文档共123页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)