一种很棒的二叉树非递归后序遍历方法
( 源自:百度知道。 我承认,我对这个设计非常非常欣赏,尤其是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 }
**************************************************************
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对困难,能够不休不眠;面对压力,能够迎接挑战。他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想,用智慧把属于自己的事业开创。其实我是一个程序员[=.=]
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对困难,能够不休不眠;面对压力,能够迎接挑战。他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想,用智慧把属于自己的事业开创。其实我是一个程序员[=.=]