PTA Tree Traversals Again 测试点0,4没过


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max 31

typedef struct StackNode* PtrStack;
struct StackNode
{
    int stack[max];
    int position;
};
typedef PtrStack Stack;

Stack CreateStack();
void Push(Stack mystack, int a);
int Pop(Stack mystack);
void Traversal(int* midorder, int left, int right, int cnt, int* flag, int* flag2);
int search(int target, int* midorder, int cnt);

int main()
{
    int cnt;
    char* cmp = "Push";
    char* tmp = (char*)malloc(sizeof(char) * 5);
    int tmpnum;
    scanf("%d", &cnt);
    int* midorder = (int*)malloc(sizeof(int) * cnt);
    int* preorder = (int*)malloc(sizeof(int) * cnt);
    int* flag = (int*)malloc(sizeof(int) * cnt);
    for (int i = 0; i < cnt; i++)
    {
        preorder[i] = i + 1;
        flag[i] = 0;
    }
    int j = 0;
    Stack input = CreateStack();
    for (int i = 0; i < cnt * 2; i++)
    {
        scanf("%s", tmp);
        if (!strcmp(tmp, cmp))
        {
            scanf("%d", &tmpnum);
            Push(input, tmpnum);
        }
        else
        {
            midorder[j++] = Pop(input);
        }
    }
    // for (int i = 0; i < cnt; i++)
    // {
    //     printf("preorder = %d, midorder = %d\n", preorder[i], midorder[i]);
    // }
    int* flag2 = (int*)malloc(sizeof(int));
    *flag2 = 0;
    Traversal(midorder, 0, cnt - 1, cnt, flag, flag2);
    return 0;
}

Stack CreateStack()
{
    Stack mystack = (Stack)malloc(sizeof(struct StackNode));
    mystack->position = -1;
    return mystack;
}

void Push(Stack mystack, int a)
{
    mystack->stack[++mystack->position] = a;
    return;
}

int Pop(Stack mystack)
{
    if (mystack->position >= 0)
    {
        return mystack->stack[mystack->position--];
    }
    else
    {
        return -1;
    }
}

void Traversal(int* midorder, int left, int right, int cnt, int* flag, int* flag2)
{
    int target = 0;
    for (int i = 0; i < cnt; i++)
    {
        if (!flag[i])
        {
            flag[i] = 1;
            target = i + 1;
            break;
        }
    }
    int pos = search(target, midorder, cnt);
    if (pos > left)
    {
        Traversal(midorder, left, pos - 1, cnt, flag, flag2);
    }
    if (pos < right)
    {
        Traversal(midorder, pos + 1, right, cnt, flag, flag2);
    }
    if (!*flag2)
    {
        *flag2 = 1;
    }
    else
    {
        printf(" ");
    }
    printf("%d", target);
    return;
}

int search(int target, int* midorder, int cnt)
{
    int i = 0;
    for (; i < cnt; i++)
    {
        if (midorder[i] == target)
        {
            break;
        }
    }
    return i;
}

img

img

img

img

不知代码逻辑错误在哪

题目是什么?