正文

二叉树遍历非递归算法2006-10-29 21:46:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/byoneself/19799.html

分享到:

 PreOrder(BiTree T)  //先序非递归遍历二叉树

 {

          InitStack(S);  //创建工作栈

          Push(S,T);

          while(!StackEmpty(S))

          {

                    Pop(S,p);  //出栈

                    Visit(p);   //访问

                    if(p->rchild)

                              Push(S,p->rchild);  //右子树入栈

                    if(p->lchild)

                         Push(S,p->lchild);   //左子树入栈

          }

}

 

InOrder(BiTree T)  //中序非递归遍历二叉树

 {

          InitStack(S);  //创建工作栈

          Push(S,<T,0>);   //根入栈,且置0标志此时不能访问

          while(!StackEmpty(S))

          {

                    Pop(S,<p,flag>);  //出栈

                    if(flag==1)

                               Visit(p);  //访问标志为1可以访问

                     else

                     {

                           if(p->rchild)

                               Push(S,<p->rchild,0>);   //右子树入栈且置访问标志0

                            Push(S,<p,1>);   //根入栈且置访问标志1

                             if(p->lchild)

                                  Push(S,<p->lchild,0>);    //左子树入栈且置访问标志0

                      }

          }

}

 

PostOrder(BiTree T)  //后序非递归遍历二叉树

 {

          InitStack(S);  //创建工作栈

          Push(S,<T,0>);  //根入栈,且置i0标志此时不能访问

          while(!StackEmpty(S))

          {

                Pop(S,<p,flag>);  //出栈

                 if(flag==1)  

                          Visit(p);  //访问标志为1可以访问

                  else

                  {

                         Push(S,<p,1>);  //根入栈且置访问标志1

                           if(p->rchild)

                                  Push(S,<p->rchild,0>);  //右子树入栈且置访问标志0

                            if(p->lchild)

                                    Push(S,<p->lchild,0>);  //左子树入栈且置访问标志0

                   }

         }

}

 

LayerOrder(BiTree T)  //层次遍历二叉树

 {

          InitQueue(Q);  //创建工作队列

          EnQueue(Q,T);  //根入队

          while(!QueueEmpty(Q))

          {

                    DeQueue(Q,p);  //出队

                    Visit(p);  //访问

                    if(p->lchild) 

                              EnQueue(Q,p->lchild);  //左子树入队

                    if(p->rchild)

                              EnQueue(Q,p->rchild);    //右子树入队

          }

}

阅读(4588) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册