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

来源:互联网 发布:mac l2tp服务器未响应 编辑:程序博客网 时间:2024/05/21 17:18

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的深度等于数的结点数,空间占用较大。


2 0