- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第11讲第六章树(四);6.7线索二叉树
6.7.1线索二叉树的概念
对于具有n个结点的二叉树,采用二叉链存储结构时,每个结点有两个指针域,总共有2n个指针域,又由于只有n-1个结点被有效指针所指向(n个结点中只有树根结点没有被有效指针域所指向),则共有2n-(n-1)=n+1个空链域,
我们知道,遍历二叉树的结果是一个结点的线性序列。可以利用这些空链域存放指向结点的前驱和后继结点的指针。这样的指向该线性序列中的“前驱”和“后继”的指针,称作线索。;在结点的存储结构上增加两个标志位来区分这两种情况:
左标志ltag:0表示lchild指向左孩子结点
1表示lchild指向前驱结点
右标志rtag:0表示rchild指向右孩子结点
1表示rchild指向后继结点
这样,每个结点的存储结构如下:;按上述原则在二叉树的每个结点上加上线索的二叉树称作线索二叉树。对二叉树以某种方式遍历使其变为线索二叉树的过程称作按该方式对二叉树进行线索化。;Thread(b); /*中序遍历线索化二叉树*/
pre=p;
structnode*rchild; /*右孩子或线索指针*/
lchild=ht[i].
对于具有n个结点的二叉树,采用二叉链存储结构时,每个结点有两个指针域,总共有2n个指针域,又由于只有n-1个结点被有效指针所指向(n个结点中只有树根结点没有被有效指针域所指向),则共有2n-(n-1)=n+1个空链域,
这样的指向该线性序列中的“前驱”和“后继”的指针,称作线索。
elsepre-rtag=0;
voidThInOrder(TBTNode*tb)
lchild指向无线索时的根结点,ltag为0;
pre=root; /*pre是*p的前驱结点,供加线索用*/
再调用Thread(b)对整个二叉树线索化。
while(f!=-1)/*循环直到无双亲结点即到达树根结点*/
lchild=ht[i].
ht[lnode].
{min2=ht[k].
(4)重复(2)、(3)两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。;为了实现线索化二叉树,将前面二叉树结点的类型定义修改如下:
typedefstructnode
{ElemTypedata; /*结点数据域*/
intltag,rtag; /*增加的线索标记*/
structnode*lchild; /*左孩子或线索指针*/
structnode*rchild; /*右孩子或线索指针*/
}TBTNode; /*线索树结点类型???义*/;下面是建立中序线索二叉树的算法。CreaThread(b)算法是将以二叉链存储的二叉树b进行中序线索化,并返回线索化后头结点的指针root。Thread(p)算法用于对于以*p为根结点的二叉树中序线索化。在整个算法中p总是指向当前被线索化的结点,而pre作为全局变量,指向刚刚访问过的结点,*pre是*p的前驱结点,*p是*pre的后继结点。;CreaThread(b)算法思路是:先创建头结点*root,其lchild域为线索,rchild域为链指针。将rchild指针指向*b,如果b二叉树为空,则将其lchild指向自身。否则将*root的lchild指向*b结点,p指向*b结点,pre指向*root结点。再调用Thread(b)对整个二叉树线索化。最后加入指向头结点的线索,并将头结点的rchild指针域线索化为指向最后一个结点(由于线索化直到p等于NULL为止,所以最后一个结点为*pre)。;TBTNode*CreaThread(TBTNode*b)/*中序线索化二叉树*/
{TBTNode*root;
root=(TBTNode*)malloc(sizeof(TBTNode));/*创建头结点*/
root-ltag=0;root-rtag=1;root-rchild=b;
if(b==NULL)root-lchild=root; /*空二叉树*/
else
{root-lchild=b;
pre=root; /*pre是*p的前驱结点,供加线索用*/
Thr
文档评论(0)