二叉树的后序遍历非递归
算法思想:迭代写法,利用pre记录上一个访问过的结点,与当前结点比较,如果是当前结点的子节点,说明其左右结点均已访问,将当前结点出栈,更新pre记录的对象。
//结构体
typedef struct BiTree{
char data;
BiTree *lchild;
BiTree *rchild;
}BiTree;
//访问结点
void visit(BiTree *b){
printf("%c ",b->data);
}
//二叉树的后序遍历非递归
void PostOrderWithoutRecursion(BiTree *T){
if (!T)
return;
BiTree *s[MaxSize]; //数组模拟栈
BiTree *pre; //定义一个前驱指针指向前一个被访问的结点
int top=-1;
while(T||top!=-1){
while (T){ //首先先将左面的元素全部入栈
s[++top]=T;
T=T->lchild;
}
if(top!=-1){
T=s[top]; //取出栈顶元素
if(T->rchild==NULL||T->rchild==pre){
visit(T);
top--;
pre=T;
T=NULL; //当有一个元素被访问的时候 栈顶应该为他的双亲结点当T为NULl时候下次一被取出的恰好就是双亲
}else{
T=T->rchild;
}
}
}
}