一种很棒的二叉树非递归后序遍历方法

( 源自:百度知道。 我承认,我对这个设计非常非常欣赏,尤其是else while 的设计,很好的体现了后序遍历的特点 )

 1 void PostOrder( BiTree T)
 2 {
 3     InitStack( S );//初始化栈
 4     BiTree p = T; // 遍历指针、入口地址
 5     unsigned sign;//记录结点从栈中弹出的次数
 6 
 7     while( p || !IsEmpty( S ) )
 8     {
 9         if( p )
10         {
11             Push( p );  //第一次遇到结点T时压入其指针 
12             Push( 1 );  //置标志为1 
13             p = p->lchild;
14         }
15         else // p为空指针,循环出栈
16         {
17             while ( !IsEmpty(S) )   //后序遍历中,当访问完一个结点时,则以该结点为根的树都访问完,所以下一步应该继续出栈,
18             {
19                 sign = Pop( );
20                 p = ( BiTree )Pop( );
21                 
22                 if( sign == 2 ) //表示T的左右子树都已走过 
23                     Visit( p ); 
24                 else if( sign == 1 )//表示仅走过T的左子树 ,右子树必定是第一次遇到,
25                 {
26                     Push( p );
27                     Push( 2 );
28                     p = p->rchild;
29                     break;
30                 }//else if
31             } //while ( !IsEmpty(S) )  
32         }//else
33 
34         //之前没考虑到这个地方,罪过!
35         if(IsEmpty(S))
36             break;
37     }//while( p || !IsEmpty( S ) )
38 }

posted on 2012-04-03 20:10  NLP新手  阅读(351)  评论(0编辑  收藏  举报

导航