1. 程式人生 > >不用棧和遞迴,實現線索化二叉樹的遍歷(還沒人看的話就沉了吧)

不用棧和遞迴,實現線索化二叉樹的遍歷(還沒人看的話就沉了吧)

本帖最後由 fzy20062008 於 2012-4-24 13:09 編輯

線索化二叉樹的儲存結構
ElemType struct
{
      ElemType  data;
      struct       ThreadNode    *lichind,*rchild;
      int                                  ltag,rtag;
}ThreadNode, *ThreadTree;


實現演算法
1)後序線索化二叉樹沿前驅遍歷
ThreadNode *Prenode(ThreadNode *p)                //求後序線索樹中結點p在後序序列下的前驅結點
{
    if(p->rtag==0)    return p->rchild;                  //有右孩子的話,則直接返回右孩子
    else                    return p->lchild;                   //若沒有右孩子,則直接返回左孩子(ltag==0)或者前驅(ltag==1)                        
}

void Reverse_PostOrder(ThreadNode *root)         //沿前驅遍歷後序線索二叉樹(即逆向
輸出後序序列)
{
     for(ThreadNode *p=root;p!=NULL;p=Prenode(p))
              visit(p);
}   


2)前序線索化二叉樹沿後繼進行遍歷
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)前序沿前驅遍歷,後序沿後繼遍歷,不使用棧或者遞迴就無法實現!!