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