【背景】
在具有n个结点二叉树中,共有n+1个指针域空置不用。为此,A. j. Parlis 和C. Thornton 提出利用二叉数中这些空的链域来存储结点前驱或后继的地址信息。即:若某个结点的left指针为空,则使该left指针指向该结点的前驱结点;若某个结点的right指针为空,则使该right指针指向该结点的后继结点。
为了区别两个指针域的含义,每个结点的存储结构中增加两个布尔型的线索标志字段Lthread 和Rthread 。
指向前驱结点和后继结点的指针为线索(thread),带有线索的二叉树称为线索二叉树(Threaded Binary Tree) 。
【定义】
//线索二叉树类型定义
struct TBTreeNode
{ bool Lthread, Rthread;
ElemType data;
TBTreeNode *leftChild;
TBTreeNode *rightChild;
};
当Lthread=true时,leftChild指向结点的前驱结点。
当Lthread=false时,leftChild指向结点的左孩子。
当Rthread=true时,rightChild指向结点的后继结点。
当Rthread=false时,rightChild指向结点的右孩子。
【中序线索化】
void Threaded(TBTreeNode *t, int flag=0)
{ static TBTreeNode *prenode;
//当前结点t的前驱指针
if(flag == 0) prenode=NULL;
// prenode初值为空
if(t!=NULL)
//t树存在
{ Threaded(t->leftChild, 1);
//对左子树线索化
if( t->leftChild==NULL ) t->Lthread=TRUE;
else t->Lthread=FALSE;
//置左线索标志值
if(t->rightChild==NULL) t->Rthread=TRUE;
else t->Rthread=FALSE;
//置右线索标志值
if(prenode!=NULL)
//当前结点的前驱存在
{ if(prenode->Rthread) prenode->rightChild=t; //互指
if( t->Lthread ) t->leftChild=prenode;
}
prenode=t;
//t作为中序遍历后继结点的前驱
Threaded(t->rightChild, 1); //对右子树线索化
}
}