1定义
在每个结点中增加指向其前驱和后继结点的指针,将降低存储空间的效率。n个结点的二叉链表中含有n+1个空指针,在n个结点的二叉链表中含有2n-(n-1)=n+1个空指针。可以利用这些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的指针。这种附加的指针称为线索,加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。为了区分一个结点的指针是指向其孩子的指针,还是指向其前驱或后继结点的线索,可在每个结点中增加两个线索标志。
以二叉链表结点数据结构所构成的二叉链表作为二叉树的存储结构,叫做线索二叉链表;指向结点的线性前驱或者线性后继结点的指针叫做线索;加上线索的二叉树称为线索二叉树;对二叉树以某种次序遍历将其变为线索二叉树的过程叫做线索化。
中序线索化是指用二叉链表结点数据结构建立二叉树的二叉链表,然后按照中序遍历的方法访问结点时建立线索。
2程序代码
#include <stdio.h>
#include <malloc.h>
typedef enum{Link,Thread} PointerTag; /*指针标志*/
typedef char DataType;
typedef struct BiThreTree{ /*定义结点元素*/
PointerTag LTag,RTag;
DataType data;
struct BiThreTree *lchild,*rchild;
}BiThreTree;
BiThreTree *pre; /*全局变量,用于二叉树的线索化*/
BiThreTree *CreateTree() /*按前序输入建立二叉树*/
{
BiThreTree *T;
DataType ch;
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();
}
return T;
}
void InThread(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) /*中序线索化二叉树*/
{
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;
return Thre;
}
void InThrTravel(BiThreTree *Thre) /*中序遍历二叉树*/
{
BiThreTree *p;
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;
}
}
void main()
{
BiThreTree *T,*Thre;
printf(“PreOrder Create Binary Tree:\n”);
T=CreateTree();
Thre=InOrderThrTree(T);
printf(“InOrder Traverse Binary Tree:\n”);
InThrTravel(Thre);
system("pause");
}