//无法通过PTA上的一道题,但楼主找不到错误,最后放弃了这个思路学习其他遍历代码,遂记录原始代码
void PreorderTraversal(BinTree BT)//中左右
{
Stack S=CreateStack();
Position P=BT;
Flag(BT);
while(P)
{
if(P->Left&&P->Left->flag!=2)//左边有,但是先打印我这个中,然后记录我这个中并去左边
{
printf(" %c",P->Data);
Push(S,P);
P->flag=1;//小ban
P=P->Left;
}
else if(P->Right&&P->Right->flag!=2)//左边没有,如果右边有,就去右边
{//去之前,如果这个点没被小ban,打印,被小ban了就不打印,总之将该点大ban
if(P->flag!=1)
printf(" %c",P->Data);
P->flag=2;
P=P->Right;
}
else if(!IsEmpty(S))//左右都没有,只能回溯并打印当前数据
{
if(P->flag!=1&&P->flag!=2)//回溯之前检查这个点有没有ban
printf(" %c",P->Data);
P->flag=2;
P=Pop(S);
}
else//按理说是到达最右
{
printf(" %c",P->Data);
break;
}
}
}
void InorderTraversal(BinTree BT)//左中右
{
Stack S=CreateStack();
Position P=BT;
Flag(BT);
while(P)
{
if(P->Left->flag!=2&&P->Left)//不到最左一直移动
{
Push(S,P);
P=P->Left;
}
else if(P->Right->flag!=2&&P->Right)//左边没有去右边,但是先打印我这个中,然后ban了
{//去右边就没必要记录了
printf(" %c",P->Data);
P->flag=2;
P=P->Right;
}
else if(!IsEmpty(S))//左右都没有,直接打印这个点,并且ban这个点
{
printf(" %c",P->Data);
P->flag=2;
P=Pop(S);
}
else//最后到达一个没有左右后继前驱被ban的点
{
printf(" %c",P->Data);
break;
}
}
}
void PostorderTraversal(BinTree BT)//左右中
{
Stack S=CreateStack();
Position P=BT;
Flag(BT);
while(P)
{
if(P->Left&&P->Left->flag!=2)//不到最左一直移动
{
Push(S,P);
P=P->Left;
}
else if(P->Right&&P->Right->flag!=2)//没左就一直右
{
Push(S,P);
P=P->Right;
}
else if(!IsEmpty(S))//没有左右后继,有前驱
{
printf(" %c",P->Data);
P->flag=2;
P=Pop(S);
}
else//最后到最中间,什么都没有
{
printf(" %c",P->Data);
break;
}
}
}
void Flag(struct TNode *B)//
{
if(B)
{
B->flag=0;
Flag(B->Left);
Flag(B->Right);
}
}
1633

被折叠的 条评论
为什么被折叠?



