不用栈和递归,实现线索化二叉树的遍历(还没人看的话就沉了吧)

来源:互联网 发布:北京培训seo哪个好 编辑:程序博客网 时间:2024/05/04 10:11

不用栈和递归,实现线索化二叉树的遍历(还没人看的话就沉了吧) 

[复制链接]  
fzy20062008

35

主题

820

帖子

1453

积分

王道论坛高级道友

Rank: 4

考研年份
2013
报考学校
华南理工大学
本科学校
西藏大学
注册时间
2012-3-1
最后登录
2013-9-24
  • 发消息
跳转到指定楼层
1
 发表于 2012-4-24 13:05 | 只看该作者 回帖奖励
本帖最后由 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)前序沿前驱遍历,后序沿后继遍历,不使用栈或者递归就无法实现!!
0 0