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);
}
}