您的位置:首页 > 其它

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

2016-10-27 18:04 417 查看


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

[复制链接]
  
fzy20062008





35
主题
820
帖子
1453
积分
王道论坛高级道友



考研年份
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)前序沿前驱遍历,后序沿后继遍历,不使用栈或者递归就无法实现!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐