收藏 分享(赏)

第6章 树形结构 (31).ppt

上传人:scg750829 文档编号:8271117 上传时间:2019-06-17 格式:PPT 页数:13 大小:319.50KB
下载 相关 举报
第6章  树形结构 (31).ppt_第1页
第1页 / 共13页
第6章  树形结构 (31).ppt_第2页
第2页 / 共13页
第6章  树形结构 (31).ppt_第3页
第3页 / 共13页
第6章  树形结构 (31).ppt_第4页
第4页 / 共13页
第6章  树形结构 (31).ppt_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、称采用这种结构存储的叫线索链表,二叉树的第三种存储方式。 其中指示前驱和后继的链域称为线索(也就是lchild 、 rchild 如果指向的不是左右孩子而是前驱和后继那么就称为线索)图中指向的是线索用虚线来画,否则用实线。 加上线索的二叉树称为线索二叉树 对二叉树以某种次序遍历使其变为线索二叉树的过程称为线索化 中序线索二叉树 先序线索二叉树 后序线索二叉树,整体结构:增设一个头结点,使其lchild指向二叉树的根结点,并将该结点作为遍历访问的第一个结点的前驱和最后一个访问结点的后继。,最后用头指针指向头结点,通过这个头指针找到该棵线索二叉树,0,0,0,0,1,1,1,1,1,1,0,1,6

2、.6.2 线索化二叉树为了实现线索化二叉树,将前面二叉树结点的类型定义修改如下:typedef struct node ElemType data; /*结点数据域*/int ltag,rtag; /*增加的线索标记*/struct node *lchild; /*左孩子或线索指针*/struct node *rchild; /*右孩子或线索指针*/ TBTNode; /*线索树结点类型定义*/,6.6.2 线索化二叉树算法设计typedef struct node ElemType data;int ltag,rtag; /增加的线索标记struct node *lchild;struct

3、node *rchild; TBTNode;TBTNode * CreateTBTNode(char *str) /建立二叉树(二叉链表的方式) TBTNode * CreaThread(TBTNode *b) /线索化二叉树,算法设计,TBTNode *CreaThread(TBTNode *b) /线索化二叉树,增加一个头结点,将整棵树作为他的左孩子,选择一种遍历方式,将二叉树线索化,生成某种访问顺序的线索化二叉树。,TBTNode *CreaThread(TBTNode *b) /*中序线索化二叉树*/ TBTNode *root;root=(TBTNode *)malloc(sizeo

4、f(TBTNode); /*创建头结点*/root-ltag=0;root-rtag=1; root-lchild=b; pre=root; Thread(b); pre-rchild=root; pre-rtag=1;root-rchild=pre; return root; ,pre,1,Thread(p)算法思路是: *p 指向当前访问的结点 *pre指向前一访问的结点 采用中序遍历的方式Thread (b-lchild);printf(“%c “,b-data);Thread (b-rchild);,当前访问结点没有左孩子,就设置为线索,指向前驱 如果访问过的结点没有右孩子,则设置为线

5、索,指向后继,TBTNode *pre; /*全局变量*/ void Thread(TBTNode * /*递归调用右子树线索化*/ ,中序遍历(递归),6.6.3 遍历线索化二叉树要遍历的第一个结点依次找结点的后继直到回到头结点,所有的问题归结为如何找后继结点?,D结点的后继:rtag=1,rchild指向后继,1,B结点的后继:rtag=0,rchild指向右孩子,从右孩子开始从左指针的方向找到第一个没有左孩子的结点S,if(p-rtag=1) p=p-rchild; else p=p-rchild;while(p-ltag=0)p=p-lchild;,6.6.3 遍历线索化二叉树从根结点

6、开始找遍历的第一个结点,1,tb,P=tb-lchild,p,while(p-lchild!=tb) p=p-lchild;,6.6.3 遍历线索化二叉树 1、 要遍历的第一个结点 2、 依次找结点的后继 3、直到回到头结点,if(p-rtag=1) p=p-rchild; else p=p-rchild;while(p-ltag=0)p=p-lchild;,void ThInOrder(TBTNode *tb) TBTNode *p=tb-lchild; /指向根结点while(p-lchild!=tb) p=p-lchild;while (p!=tb) printf(“%c “,p-data);if(p-rtag=1) p=p-rchild;else p=p-rchild;while(p-ltag=0)p=p-lchild; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报