數據結構與算法-樹(線索二叉樹)

小孱弱弱又來了,今天分享的是二叉樹的應用-線索二叉樹,在我們用二叉鏈表時,有這樣一個問題,只有一個孩子的結點和葉子結點,會有大量空餘指針域,這無疑是巨大的浪費,,我們前輩們就設計出來線索二叉樹,線索二叉樹就是在每個結點加上兩條線索,一個指向它的中序遍歷前驅,一個指向它的中序遍歷的後繼,若不存在前驅或者後繼,指向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;
  } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章