后序:
void postorder_1(TNode* bt)
{
Stack S;
InitStack(S);
TNode* p=bt;
TNode* r=NULL;
while(!StackEmpty(S)||p!=NULL)
{
while(p!=NULL)
{
Push(S,p);
p=p->lchild;
}
GetTop(S,p);
if(p->rchild!=NULL&&p->rchild!=r)
p=p->rchild;//转向右子树
else
{
Pop(S,p);
visit(p);
r=p;//标记右孩子已经访问过了
p=NULL;//访问完一个结点之后需要置空,不置空的话又会把这个结点压进去
}
}
}
void postorder_2(TNode* &L)
{
Stack S;
InitStack(S);
TNode* p=L;
TNode* r=NULL;
while(!StackEmpty(S)||p!=NULL)
{
if(p!=NULL)
{
Push(S,p);
p=p->lchild;
}
else
{
GetTop(S,p);
if(p->rchild!=NULL&&p->rchild!=r)
p=p->rchild;
else
{
Pop(S,p);
visit(p);
r=p;//标记右孩子已经访问过了
p=NULL;//访问完一个结点后需要置空,不置空则又会把这个结点压进去
}
}
}
}
/*
A
/ \
B C
先序序列:ABC
后序序列:BCA
逆后序序列:ACB=先序遍历对左右子树的遍历顺序互换
Stack1存放逆后序遍历,然后压入Stack2
Stack2的元素全部出栈所得序列即为后序遍历序列
*/
void postorder_3(TNode* bt)
{
TNode* p;
Stack S1,S2;
InitStack(S1);
InitStack(S2);
Push(S1,bt);
while(StackEmpty(S1)!=true)
{
Pop(S1,p);
Push(S2,p);
if(p->lchild!=NULL)
Push(S1,p->lchild);
if(p->rchild!=NULL)
Push(S1,p->rchild);
}
while(StackEmpty(S2)!=true)
{
Pop(S2,p);
visit(p);
}
}