不用棧和遞迴,實現線索化二叉樹的遍歷(還沒人看的話就沉了吧)
阿新 • • 發佈:2019-02-04
線索化二叉樹的儲存結構
ElemType struct
{
ElemType data;
struct ThreadNode *lichind,*rchild;
int ltag,rtag;
}ThreadNode, *ThreadTree;
實現演算法
1)後序線索化二叉樹沿前驅遍歷
ThreadNode *Nextnode(ThreadNode *p) //求前序線索樹中結點p在前序序列下的後繼結點
{
if(p->ltag==0) return p->lchild; //有左孩子的話,則直接返回左孩子
else return p->rchild; //若沒有左孩子,則直接返回右孩子(rtag==0)或者後繼(rtag==1)
}
void PreOrder(ThreadNode *root) //沿後繼遍歷前序線索二叉樹(即輸出前序序列)
{
for(ThreadNode *p=root;p!=NULL;p=Nextnode(p))
visit(p);
}
3)中序線索化二叉樹沿前驅進行遍歷
ThreadNode *Lastnode(ThreadNode *p) //求中序線索化二叉樹中中序序列的最後一個結點
{
while(p->rtag==0) p=p->rchild;
return p;
}
ThreadNode *Prenode(ThreadNode *p) //求中序線索樹中結點p在中序序列下的前驅結點
{
if(p->ltag==0) return Lastnode(p->lchild);
else return p->rchild;
}
void Reverse_InOrder(ThreadNode *root) //沿前驅遍歷中序線索二叉樹(即逆向
{
for(ThreadNode *p=Lastnode(root);p!=NULL;p=Prenode(p))
visit(p);
}
4)中序線索化二叉樹沿後繼進行遍歷(單科書P99給出的演算法)
ThreadNode *Firstnode(ThreadNode *p)
{
while(p->ltag==0) p=p->lchild;
return p;
}
ThreadNode *Nextnode(ThreadNode *p)
{
if(p->rtag==0) return Firstnode(p);
else return p->rchild;
}
void Inorder(ThreadNode *root)
{
for(ThreadNode *p=Firsttnode(root);p!=NULL;p=Nextnode(p))
visit(p);
}
5)前序沿前驅遍歷,後序沿後繼遍歷,不使用棧或者遞迴就無法實現!!