數據結構:線索二叉樹

Threaded Binary Tree

二叉樹的中序線索化

很顯然前序和後續線索化也是差不多的~~~就是順序變了一下

#define datatype int;
typedef struct node *ThreadBintree;
struct node{
	int ltag,rtag;
	datatype data;
	ThreadBintree left,right;
};

InThread(ThreadBintree BT)  //中序線索化 
{
	ThreadBintree pre;
	if(BT)
	{
		InThread(BT->left);
		if(BT->left==NULL) ltag=1;
		if(BT->right==NULL) rtag=1;
		if(pre)
		{
			if(pre->rtag==1)	pre->left=p;
			if(p->ltag==1) p->right=pre;
		}
		pre=p;
		InThread(BT->right);
	}
}

訪問線索二叉樹:查找+遍歷

查找*p(中序線索二叉樹)

1.查找*p的後繼結點
思路:

  • 如果rtag==1 那麼p->right就是後繼結點
  • 如果rtag==0 p的右子樹中第一個被訪問的結點就是後繼結點 也就是出現的左下結點(找到的這個左下結點ltag==0
ThreadBintree InOrderNext(ThreadBintree p)
{
   ThreadBintree q;
   if(p->rtag==1) return p->right;
   else
   {
   	q=p->right;
   	while(q->ltag==0)
   	{
   		q->left;
   	}
   }
   return q;
}

2.查找p的前趨結點

ThreadBintree InOrderLast(ThreadBintree p)
{
	ThreadBintree q;
	if(p->ltag==1) return p->left;
	else
	{
		q=p->left;
		while(q->rtag==0)
		{
			q->right;
		}
	}
	return q;
 } 

查找*p(後序線索二叉樹)

1.尋找p的前趨(比較容易)
思路:

  • ltag==1 那麼前趨爲 p->left
  • ltag==0: p->rtag==0 前趨 p->rigtht 有右子樹,那麼前趨就是右子樹; p->rtag==1 p->left沒有右子樹,前趨就是左子樹;

2.尋找p的後繼

  • p爲根 無後繼
  • p是parent右孩子 則後繼爲parent
  • p是左孩子,無右兄弟,後繼爲parent
  • p是左孩子,有右兄弟,那麼後繼爲parent的右子樹中第一個後序遍歷到的結點(最左下的葉子結點)

遍歷(中序線索二叉樹)

思路:一直找結點p的後繼結點並訪問即可

TravelIn(ThreadBintree p)
{
	if(p)
	{
		while(p->ltag==0)   //找中序序列的開始結點
		p=p->left;
		
		do{
			printf("%t%d\n",p->data);
			p=InOrderNext(p);
		} while(p);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章