線索二叉樹

該文檔來自百度百科

概念

這種加上了線索的二叉鏈表稱爲線索鏈表,相應的二叉樹稱爲線索二叉樹(Threaded BinaryTree)。根據線索性質的不同,線索二叉樹可分爲前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種
注意:
線索鏈表解決了無法直接找到該結點在某種遍歷序列中的前趨和後繼結點的問題,出現了二叉鏈表找左、右孩子困難的問題。

線索二叉樹結構

二叉樹的遍歷本質上是將一個複雜的非線性結構轉換爲線性結構,使每個結點都有了唯一前驅和後繼(第一個結點無前驅,最後一個結點無後繼)。對於二叉樹的一個結點,查找其左右子女是方便的,其前驅後繼只有在遍歷中得到。爲了容易找到前驅和後繼,有兩種方法。一是在結點結構中增加向前和向後的指針fwd和bkd,這種方法增加了存儲開銷,不可取;二是利用二叉樹的空鏈指針。現將二叉樹的結點結構重新定義如下:

lchild | ltag | data | rtag | rchild
其中:ltag=0 時lchild指向左子女;
ltag=1 時lchild指向前驅;
rtag=0 時rchild指向右子女;
rtag=1 時rchild指向後繼;

構建

建立線索二叉樹,或者說對二叉樹線索化,實質上就是遍歷一棵二叉樹。在遍歷過程中,訪問結點的操作是檢查當前的左,右指針域是否爲空,將它們改爲指向前驅結點或後續結點的線索。爲實現這一過程,設指針pre始終指向剛剛訪問的結點,即若指針p指向當前結點,則pre指向它的前驅,以便設線索。
另外,在對一顆二叉樹加線索時,必須首先申請一個頭結點,建立頭結點與二叉樹的根結點的指向關係,對二叉樹線索化後,還需建立最後一個結點與頭結點之間的線索。
下面是建立中序二叉樹的遞歸算法,其中pre爲全局變量。

void InThreading(BiThrTree*p);//預先聲明
BiThrNodeType*pre;
BiThrTree*InOrderThr(BiThrTree*T)
{/*中序遍歷二叉樹T,並將其中序線索化,pre爲全局變量*/
BiThrTree*head;//線索二叉樹的頭結點,指向根結點
head=(BitThrNodeType*)malloc(sizeof(BitThrNodeType));/*設申請頭結點成功*/
head->ltag=0;head->rtag=1;/*建立頭結點*/
head->rchild=head;/*右指針回指*/
if(!T)
head->lchild=head;/*若二叉樹爲空,則左指針回指*/
else
{
head->lchild=T;pre=head;
InThreading(T);/*中序遍歷進行中序線索化*/
pre->rchild=head;
pre->rtag=1;/*最後一個結點線索化*/
head->rchild=pre;
}
returnhead;
}
voidInThreading(BiThrTree*p)
{/*通過中序遍歷進行中序線索化*/
if(p)
{
InThreading(p->lchild);/*左子樹線索化,遞歸*/
if(p->lchild==NULL)/*前驅線索*/
{
 p->ltag=1;
p->lchild=pre;
}
else
p->ltag=0;
if(p->rchild==NULL)
p->rtag=1;/*後驅線索*/
else
p->rtag=0;
if(pre!=NULL&&pre->rtag==1)
pre->rchild=p;
pre=p;
InThreading(p->rchild);/*右子樹線索化*/
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章