【資料結構】線索二叉樹
阿新 • • 發佈:2018-12-20
【背景】
在具有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); //對右子樹線索化 } }