TRAVERSAL 질문입니다.

  • hyunbin
    hyunbin

    #include
    #include

    int C, N, postorder[100], inorder[100], preorder[100];

    int findIndex(int val);
    int *slice(int arr[], int a, int b);
    void printPostOrder(int preorder[], int inorder[]);

    int main(void){

    int i, j;
    
    scanf("%d", &C);
    
    for(i = 0 ; i < C ; i ++){
        ////////////////////////////
    
        memset(preorder, 0, sizeof(int) * 100);
        memset(inorder, 0, sizeof(int) * 100);
    
        ////////////////////////////
        scanf("%d", &N);
    
        for(j = 0 ; j < N ; j ++)
            scanf("%d", &preorder[j]);
    
        for(j = 0 ; j < N ; j ++)
            scanf("%d", &inorder[j]);
    
        printPostOrder(preorder, inorder);
        printf("\n");
    }
    
    return 0;

    }

    int findIndex(int arr[], int val){

    int i, j, size = 0;
    
    for(i = 0 ; i < N ; i ++){
        if(arr[i] != 0)
            size += 1;
    }
    
    for(i = 0 ; i < size ; i ++){
        if(arr[i] == val)
            return i;
    }
    
    return -1;

    }

    int* slice(int arr[], int a, int b){

    int tmp[100], i, pos;
    
    memset(tmp, 0, sizeof(int) * 100);
    
    for(i = a , pos = 0; i < b + 1 ; i ++, pos ++){
        tmp[pos] = arr[i];
    }
    
    return tmp;

    }

    void printPostOrder(int preord[], int inord[]){

    int root, L, i, size = 0;
    int tmp1[100], tmp2[100], tmp3[100], tmp4[100];
    
    memset(tmp1, 0, sizeof(int) * 100);
    memset(tmp2, 0, sizeof(int) * 100);
    memset(tmp3, 0, sizeof(int) * 100);
    memset(tmp4, 0, sizeof(int) * 100);
    
    for(i = 0 ; i < N ; i ++){
        if(preord[i] > 0)
            size += 1;
    }
    
    if(size == 0)
        return ;
    
    root = preord[0];
    
    L = findIndex(inord, root); // 
    
    // 트리 왼쪽
    memcpy(tmp1, slice(preord, 1, L), sizeof(int) * 100);
    memcpy(tmp2, slice(inord, 0, L - 1), sizeof(int) * 100);
    
    // 트리 오른쪽
    memcpy(tmp3, slice(preord, L + 1, size - 1), sizeof(int) * 100);
    memcpy(tmp4, slice(inord, L + 1, size - 1), sizeof(int) * 100);
    
    printPostOrder(tmp1, tmp2);
    printPostOrder(tmp3, tmp4);
    
    printf("%d ", root);

    }

    안녕하세요. TRAVERSAL문제를 푸는데 자꾸 오답이 떠서 질문드립니다. '프로그래밍 대회에서 배우는 알고리즘 문제해결전략'에서 도움을 받고 이 문제를 풀었는데 자꾸 오답이 뜨네요.

    제가 어디서 실수하고있는지를 잘모르겠습니다.
    알고스팟에서의 예제 말고 다른 예제도 돌렸는데 제대로 나와서...


    10년 전
2개의 댓글이 있습니다.
  • Sharifa
    Sharifa

    코드를 실행해보면 slice 함수에서 임시배열을 리턴하고 있다는 경고가 뜹니다.
    tmp배열 선언을 malloc으로 하면 정답이 나옵니다.


    10년 전 link
  • hyunbin
    hyunbin

    감사합니다.......으아.........


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.