1. 程式人生 > >【資料結構】線索二叉樹

【資料結構】線索二叉樹

【背景】

在具有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);  //對右子樹線索化
      }
}