小孱弱弱又來了,今天分享的是二叉樹的應用-線索二叉樹,在我們用二叉鏈表時,有這樣一個問題,只有一個孩子的結點和葉子結點,會有大量空餘指針域,這無疑是巨大的浪費,,我們前輩們就設計出來線索二叉樹,線索二叉樹就是在每個結點加上兩條線索,一個指向它的中序遍歷前驅,一個指向它的中序遍歷的後繼,若不存在前驅或者後繼,指向NULL,我們對以某種次序遍歷使其變爲線索二叉樹的過程叫做線索化。爲了區分指針是指向哪,我們設置兩個布爾型變量,ltag和rtag,ltag爲0表示指向左孩子,爲1那就指向前驅,同樣的rtag爲0指向右孩子,爲1指向它的後繼。
也就是說每個結點包含左孩子域、ltag、數據域、rtag和右孩子域,一共五個域,如果才用的二叉樹經常需要遍歷和查找序列的前驅和後繼,那麼採用線索二叉鏈表就很不錯哦。
下面上代碼:
//線索二叉樹的定義
typedef enum{Link,Thread}PointerTag;
typedef struct BiThrNode
{
int data;
struct BiThrNode*lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
//中序遍歷線索化算法
BiThrTree pre;//設置一個工作指針,指向最近一個訪問的結點
void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);
if(!p->lchild)
{
p->LTag=Thread;
p->lchild=pre;
}
if(!pre->rchild)
{
pre->RTag=Thread;
pre->rchild-p;
}
pre=p;
InThreading(p->rchild);
}
}
//中序遍歷線索二叉樹
int InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link)
{
p=p->lchild;
}
cout<<p->data;
while(p->RTag==Thread&&p->rchild!=T)
{
p=p->rchild;
cout<<p->data;
}
p=p->rchild;
}
return true;
}