【数据结构】线索二叉树

【背景】

在具有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);  //对右子树线索化
      }
}

猜你喜欢

转载自blog.csdn.net/nju_zjy/article/details/83623749