2

事前順序で値を出力する再帰関数を作成しようとしています。ただし、何らかの理由で、inOrder関数と同じように出力され続けます。postOrder関数は正常に機能しますが、再帰関数を少し異なる方法で実行する必要がありました。以下の私のコードを見て、何が問題なのか教えてもらえますか?これが一日中私に問題を与えてきたので、私は本当に感謝しています。前もって感謝します

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#define TRUE 1
#define FALSE 0

typedef struct bnodestruct
{
    int value;
    struct bnodestruct *left;
    struct bnodestruct *right;
}bnode;

typedef bnode *bnodePtr;

void displayMenu();
void insert (bnodePtr *hd, int val);
void inOrder(bnodePtr hd);
void preOrder(bnodePtr hd);
void postOrder(bnodePtr hd);
void empty (bnodePtr *hd);

int main (int argc, char **argv)
{
    int val;
    bnodePtr head;
    head = NULL;    

    char option;
    int result = 0;
    while(1)
    {
    displayMenu();

    printf("Choose an option : ");
    scanf("\n%c", &option);

    /*printf("The option chosen is %c\n", option);*/

    switch (option)
    {

        case 'q':
            printf("The program is exiting...\n");
            exit(-1);
        case 'i': 
            printf("Enter an integer value to be inserted into the linked list : ");    
            scanf("%d", &val);  
            insert(&head, val);
            break;
        case 'o':
            inOrder(head);
            break;
        case 'n':
            preOrder(head);
            break;
        case 'p':
            postOrder(head);
            break;
        case 'e':
            empty(&head);
            /*inOrder (head);*/
            break;



    }

    }

}

void displayMenu()
{

    printf("\n          Menu          \n");
    printf("(q): quit the program\n");
    printf("(i): insert integer value into the binary tree\n");
    printf("(e): empty all values from the binary tree\n");
    printf("(o): list the items contained in the binary tree in order\n");
    printf("(n): list the items contained in the binary tree in pre order\n");
    printf("(p): list the items contained in the binary tree in post order\n");
}

void insert (bnodePtr *hd, int val)
{

    if (*hd == NULL)
    {
        *hd = (bnodePtr)malloc(sizeof(bnode));
        (*hd)->left = NULL;
        (*hd)->value = val;
        (*hd)->right = NULL;
    }
    else 
    {
        if (val < ((*hd)->value))
            insert (&((*hd)->left), val);
        else if (val > ((*hd)->value))
            insert (&((*hd)->right), val);
    }



}


void empty (bnodePtr *hd)
{

    bnodePtr temp1 = *hd;
    bnodePtr temp2;

    while (temp1 != NULL)
    {

        temp2 = temp1;
        temp1 = temp1->left;

        free (temp2);

    }

    *hd = NULL;

}


void inOrder (bnodePtr hd)
{

    if (hd != NULL)
    {


        inOrder(hd->left);
        printf("%d\n", hd->value);
        inOrder(hd->right);
    }



}

void preOrder (bnodePtr hd)
{

    if (hd != NULL)
    {


        printf("%d\n", hd->value);
        preOrder(hd->left);
        preOrder(hd->right);
    }


}

void postOrder (bnodePtr hd)
{

    if (hd != NULL)
    {


        inOrder(hd->left);
        inOrder(hd->right);
        printf("%d\n", hd->value);

    }



}
4

1 に答える 1

3
void postOrder (bnodePtr hd)
{
    if (hd != NULL)
    {
        inOrder(hd->left);  // XXX
        inOrder(hd->right); // XXX
        printf("%d\n", hd->value);
    }
}

そこがあなたの問題です。inOrder呼び出すべき場所に呼び出していますpostOrder

于 2012-11-26T02:12:19.130 に答える