/*
后序遍历(非递归算法)
①先序遍历顺序:根节点-左孩子-右孩子
②后序遍历顺序:左孩子-右孩子-根节点
③后序遍历倒过来:根节点-右孩子-左孩子
①和③对比发现,访问顺序只有左孩子和右孩子颠倒了一下
思路:
第一步,将二叉树按照先序非递归算法进行遍历,
注意在入栈的时候左右孩子入栈的顺序,先左后右 。
第二步,将遍历得到的结果进行倒置。
*/
void Postorder (BTNode* bt)
{
BTNode* Stack1[maxSize];
BTNode* Stack2[maxSize];//用于将访问的元素倒置
int top1 = -1;
int top2 = -1;
BTNode* p = bt;
if(p == NULL)
{
return;
}
top1 ++;
Stack1[top1] = p;//根节点入栈
while(top1 > -1)
{
p = Stack1[top1];//出栈一个元素
top1--;
top2++;
Stack2[top2] = p;//重点,出栈的结点不直接访问,而是放到另一个栈中
if(p->lchild != NULL)
{
top1++;
Stack1[top1] = p->lchild;//当前结点左孩子入栈
}
if(p->rchild != NULL)
{
top1++;
Stack1[top1] = p->rchild;//当前结点右孩子入栈
}
}
while(top2 > -1)//依次出栈,相当于把栈中的元素倒置
{
Visit(top2);//访问该结点
top2--;
}
}