typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree BT;
void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现)
{
BinTree T=BT;
Stack S=CreakStack(MaxSize);//创建并初始化堆栈S
while(T||!IsEmpty(S)){
while(T){//一直向左并将沿途结点压入堆栈
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);//结点弹出堆栈
printf("%5d",T->Data);//(访问)打印结点
T=T->Right;//转向右子树
}
}
}
void PreOrderTraversal(BinTree BT)//先序遍历非递归遍历算法(使用堆栈,用循环实现)
{
BinTree T=BT;
Stack S=CreakStack(MaxSize);//创建并初始化堆栈S
while(T||!IsEmpty(S)){
while(T){//一直向左并将沿途结点压入堆栈
printf("%5d",T->Data);//(访问)打印结点
Push(S,T);
T=T->Left;
}
if(!IsEmpty(S)){
T=Pop(S);//结点弹出堆栈
T=T->Right;//转向右子树
}
}
}
void PostOrderTraversal( 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); /*(访问)打印结点*/
}
}