pta练习TreeTraversalsAgain这样写哪错了

能否详细说下错误的两种情况是为啥

img

img

img


#include <stdio.h>
#include <stdlib.h>
#define NULL0 -1
typedef struct stack0{
    int top;
    int DataArray[35];
}*Stack;

typedef struct TreeNode{
    int data;
    int left;
    int right;
}TN[100];

TN NodeList;
void Init_Tree(TN NodeList,Stack S){
    int num;
    char ch;
    //用有限状态机来读入数据,PrevState标记上次是pop还是push,用lastptr和thisptr记录不同状态下的父子节点下标
    int LastPtr = 0,ThisPtr;
    enum {PUSH,POP};
    int PrevState = PUSH;

    scanf("%d",&num);
    //由于数组下标不能为负,0在下面又作为1的父节点,就用99代表所有空节点,值赋为-1
    for (int i = 1; i <= 99; i++)
        NodeList[i].left = NodeList[i].right = 99;
    NodeList[99].data = NULL0;
    //只有单词的第二个字母是决定性的,所以用getchar来消耗没用的字母、空格、换行符
    getchar();
    for (int i = 1; i <= 2*num; i++)
    {
        getchar();
        ch = getchar();
        if (ch == 'u')
        {
            getchar();
            getchar();
            getchar();
            ThisPtr = (int)(getchar() - '0');
            if (PrevState == PUSH)
            {
                NodeList[ThisPtr].data = ThisPtr;
                NodeList[LastPtr].left = ThisPtr;
                Push(S,ThisPtr);
                LastPtr = ThisPtr;
                PrevState = PUSH;
                getchar();
            }
            else if (PrevState == POP)
            {
                NodeList[ThisPtr].data = ThisPtr;
                NodeList[LastPtr].right = ThisPtr;
                Push(S,ThisPtr);
                LastPtr = ThisPtr;
                PrevState = PUSH;
                getchar();
            }
        }
        else if (ch == 'o')
        {
            if (PrevState == PUSH)
            {
                getchar();
                getchar();
                PrevState = POP;
                Pop(S);
                continue;
            }
            else if (PrevState == POP)
            {
                getchar();
                getchar();
                PrevState = POP;
                LastPtr = Pop(S);
            }
        }
    }
}
//递归输出结果
void PostOrder(TN NodeList,int i){
    if (NodeList[i].data == NULL0)
        return;
    else
        PostOrder(NodeList,NodeList[i].left);
        PostOrder(NodeList,NodeList[i].right);
        NodePrint(NodeList[i].data);
}
void NodePrint(int data){
    if (data != 1) printf("%d ",data);
    else printf("%d",data);
}
Stack Init_Stack(){
    Stack S = (Stack)malloc(sizeof(struct stack0));
    S->top = -1;
    return S;
}
void Push(Stack S,int data){
    S->DataArray[++S->top] = data;
}
int Pop(Stack S){
    return S->DataArray[S->top--];
}

int main(){
    Stack S = Init_Stack();
    Init_Tree(NodeList,S);
    PostOrder(NodeList,1);

    while (1);
    return 0;
}