如何用堆栈实现后序遍历的非递归程序

void InOrderTraversal( BinTree BT )
{
   BinTree T BT;
   Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
   Stack Q = CreatStack( MaxSize ); /*创建并初始化堆栈Q,用于输出反向*/
   while( T || !IsEmpty(S) ){
       while(T){ /*一直向右并将沿途结点压入堆栈*/
           Push(S,T);
           Push(Q,T);/*将遍历到的结点压栈,用于反向*/
           T = T->Right;
       }
       if(!IsEmpty(S)){
       T = Pop(S); /*结点弹出堆栈*/
       T = T->Left; /*转向左子树*/
       }
   }
   while( !IsEmpty(Q) ){
       T = Pop(Q);
       printf(“%5d”, T->Data); /*(访问)打印结点*/
   }
}

先序的访问顺序是root, left, right 假设将先序左右对调,则顺序变成root, right, left,暂定称之为“反序”。

后序遍历的访问顺序为left, right,root ,刚好是“反序”结果的逆向输出。于是方法如下:

1、反序遍历二叉树,具体方法为:将先序遍历代码中的left 和right 对调即可。

      数据存在堆栈S中。

2、在先序遍历过程中,每次Push节点后紧接着print结点。

      对应的,在反序遍历时,将print结点改为把当前结点 PUSH到堆栈Q中。

3、反序遍历完成后,堆栈Q的压栈顺序即为反序遍历的输出结果。

     此时再将堆栈Q中的结果pop并print,即为“反序”结果的逆向,也就是后序遍历的结果。

缺点是堆栈Q的深度等于数的结点数,空间占用较大。


你可能感兴趣的:(PAT-MOOC-DS)