中序线索化二叉树数据结构

中序线索化二叉树数据结构

ID:30081061

大小:66.61 KB

页数:22页

时间:2018-12-26

中序线索化二叉树数据结构_第1页
中序线索化二叉树数据结构_第2页
中序线索化二叉树数据结构_第3页
中序线索化二叉树数据结构_第4页
中序线索化二叉树数据结构_第5页
资源描述:

《中序线索化二叉树数据结构》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、中序线索化二叉树数据结构.当用二叉链表作为二叉树的存储结构时,因为每个结点中只有指向其左、右孩子结点的指针,所以从任一结点出发只能直接找到该结点的左、右孩子。在一般情况下靠它无法直接找到该结点在某种遍历次序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针,将降低存储空间的效率。与此同时,我们可以证明:在n个结点的二叉链表中含有n+1个空指针。因为含n个结点的二叉链表中含有2n个指针,除了根结点,每个结点都有一个从父结点指向该结点的指针,因此一共使用了n-1个指针,所以在n个结点的

2、二叉链表中含有2n-(n-1)=n+1个空指针。因此,可以利用这些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的指针。这种附加的指针称为线索,加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。为了区分一个结点的指针是指向其孩子的指针,还是指向其前驱或后继结点的线索,可在每个结点中增加两个线索标志。这样,线索二叉树结点类型定义为:LchildLtagDataRtagRchild其中:1.Ltag=0时,表示Lchild指向该结点的左孩子;2.Ltag=1时,表示Lchild指向该

3、结点的线性前驱结点;3.Rtag=0时,表示Rchild指向该结点的右孩子;4.Rtag=1时,表示Rchild指向该结点的线性后继结点;以二叉链表结点数据结构所构成的二叉链表作为二叉树的存储结构,叫做线索二叉链表;指向结点的线性前驱或者线性后继结点的指针叫做线索;加上线索的二叉树称为线索二叉树;对二叉树以某种次序遍历将其变为线索二叉树的过程叫做线索化。中序线索化是指用二叉链表结点数据结构建立二叉树的二叉链表,然后按照中序遍历的方法访问结点时建立线索。例如有如上图所示二叉树,则中序遍历的顺序是:O

4、/J*I+HAG【参考程序】#include#includetypedefenum{Link,Thread}PointerTag;/*指针标志*/typedefcharDataType;typedefstructBiThreTree{/*定义结点元素*/PointerTagLTag,RTag;DataTypedata;structBiThreTree*lchild,*rchild;}BiThreTree;BiThreTree*pre;/*全局变量,用于二叉树的

5、线索化*/BiThreTree*CreateTree()/*按前序输入建立二叉树*/{BiThreTree*T;DataTypech;scanf("%c",&ch);if(ch==’#’)T=NULL;else{T=(BiThreTree*)malloc(sizeof(BiThreTree));T->data=ch;T->LTag=Link;/*初始化时指针标志均为Link*/T->RTag=Link;T->lchild=CreateTree();T->rchild=CreateTree();}r

6、eturnT;}voidInThread(BiThreTree*T){BiThreTree*p;p=T;if(p){InThread(p->lchild);if(!p->lchild){p->LTag=Thread;p->lchild=pre;}if(!pre->rchild){pre->RTag=Thread;pre->rchild=p;}pre=p;InThread(p->rchild);}}BiThreTree*InOrderThrTree(BiThreTree*T)/*中序线索化二叉树*/

7、{BiThreTree*Thre;/*Thre为头结点的指针*/Thre=(BiThreTree*)malloc(sizeof(BiThreTree));Thre->lchild=T;Thre->rchild=Thre;pre=Thre;InThread(T);pre->RTag=Thread;pre->rchild=Thre;Thre->rchild=pre;returnThre;}voidInThrTravel(BiThreTree*Thre)/*中序遍历二叉树*/{BiThreTree*p;

8、p=Thre->lchild;while(p!=Thre)/*指针回指向头结点时结束*/{while(p->LTag==Link)p=p->lchild;printf("%4c",p->data);while(p->RTag==Thread&&p->rchild!=Thre){p=p->rchild;printf("%4c",p->data);}p=p->rchild;}}voidmain(){BiThreTree*T,*Thre;printf(“PreOrderCreateBin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。