1.二叉链表的线索化
template<typename DataType>
void InThrBiTree<DataType>::ThrBiTree(ThrNode<DataType>*bt,ThrNode<DataType>*pre)
{
if(bt==nullptr)return;
ThrBiTree(bt->lchild,pre);
if(bt->lchild==nullptr)
{
bt->ltag=1;
bt->lchild=pre;
}
if(bt->rchild==nullptr)bt->rtag=1;
if(pre->rtag==1)pre->rchild=bt;
pre=bt;
ThrBiTree(bt->rchild,pre);
}
2.二叉链表的查找后继结点
template<typename DataType>
ThrNode<DataType>*InThrBiTree<DataType>::Next(ThrNode<DataType>*p)
{
ThrNode<DataType>*q=nullptr;
if(p->rtag==1)q=p->rchild;
else{
q=p->rchild;
while(q->ltag==0)
q=q->lchild;
}
return q;
}
3.中序遍历
template<typename DataType>
void InThrBiTree<DataType>::InOrder()
{
if(root==nullptr)return;
ThrNode<DataType>*p=root;
while(p->ltag==0)
p=p->lchild;
cout<<p->data;
while(p->rchild!=nullptr)
{
p=Next(p);
cout<<p->data;
}
}