「ツリーの遍歴」の問題――C言語メニューの実現


二叉木の遍歴
ツリーはlson-rsonリンク方式で格納され、メニュー方式で機能タスクを設計し、完成する:ツリーを確立し、格納し、前順遍歴結果を出力し、中順遍歴結果を出力し、後順遍歴結果を出力し、左右のサブツリーを交換し、高さを統計し、その中で中で中順、後順の遍歴演算に対して非再帰方式を採用する.
完全なコード
#include
#include

typedef struct Node{
    char data;
    struct Node* left;
    struct Node* right;
}Node;

//         
Node* QandA_Build(int isRoot){
    Node *p; 
    char ch,ch2;
    if (isRoot)
        printf("      : ");
    scanf("%c", &ch);
    ch2 = getchar();
    if(ch == '#') p = NULL;
    else{
        isRoot = 0;
        p = (Node*)malloc(sizeof(Node));
        p->data = ch;
        printf("   '%c'    : ", p->data);
        p->left = QandA_Build(isRoot);
        printf("   '%c'    : ", p->data);
        p->right = QandA_Build(isRoot);
    }
    return p;
}

//          
Node* PreOrder_Build(){
    Node *p;
    char ch;
    scanf("%c", &ch);
    if (ch == '#') p = NULL;
    else{
        p = (Node*)malloc(sizeof(Node));
        p->data = ch;
        p->left = PreOrder_Build();
        p->right = PreOrder_Build();
    }
    return p;
}

//    (  )
void PreOrder(Node* t){
    if(!t)
        return ;
    else{
        printf("%c",t->data);
        PostOrder(t->left);
        PostOrder(t->right);
    }
}

//    (  )
void InOrder(Node* t){
  if(!t)
        return ;
    else{
        InOrder(t->left);
        printf("%c",t->data);
        InOrder(t->right);
    }
}

//    (  )
void PostOrder(Node* t){
    if(!t)
        return ;
    else{
        PostOrder(t->left);
        PostOrder(t->right);
        printf("%c",t->data);
    }
}

//    (   )
void InOrderByStack(Node* t){
    if (t == NULL)
        return;
    Node* stack[100];
    int top = -1; 
    Node* p = t;
    while ( top!=-1 || p ){
        //     ,         
        while(p){
            top++;
            stack[top] = p;
            p = p->left;
        }
        //   ,   
        if ( top!=-1 ){
            p = stack[top];
            top--;
            printf("%c",p->data);
            p = p->right;
        }
    }
} 

//    (   )
void PostOrderByStack(Node* t){
    if (t == NULL)
        return;
    Node* stack[100];
    int top = -1;
    
    Node* pCur = t, *pLastVisit = NULL;
    
    //      
    while (pCur){
        top++;
        stack[top] = pCur;
        pCur = pCur->left;
    }
    
    while ( top!=-1 ){
        //   ,    
        pCur = stack[top];
        top--;
        //             ,   
        if (pCur->right == NULL || pCur->right == pLastVisit){
            printf("%c", pCur->data);
            pLastVisit = pCur;
        }
        else{//       
            top++;
            stack[top] = pCur;
            pCur = pCur->right;
            while (pCur){
                top++;
                stack[top] = pCur;
                pCur = pCur->left;
            }
        }
    }
    printf("
"); } // void Exchange(Node* t){ Node *temp; if(!t) return ; else{ temp = t->left; t->left = t->right; t->right = temp; Exchange(t->left); Exchange(t->right); } } // int Height(Node* t){ if(t==NULL) return 0; else if(t->left==NULL && t->right==NULL) return 1; else { int Hl,Hr; Hl=Height(t->left); Hr=Height(t->right); if(Hl>Hr) return Hl+1; else return Hr+1; } } // Node* BuildTree(){ printf("* , !( òωó)"); int select, flag = 0; char ch; Node* tree; while(!flag){ printf("
* 1>
* 2> "); printf("
* :"); scanf("%d", &select); ch = getchar(); printf("
"); switch(select){ case 1: printf(" ( '#')。
"); tree = QandA_Build(1); printf("* !
"); flag = 1; break; case 2: printf("* ( '#'):"); tree = PreOrder_Build(); printf("* !
"); flag = 1; break; default: printf("* ! !
"); break; } } return tree; } // int main(){ int select; Node *tree = BuildTree(); while(1){ printf("
******* ******"); printf("
***-----1> ------***"); printf("
***-----2> ------***"); printf("
***-----3> ------***"); printf("
***-----4> ------***"); printf("
***-----5> ----***"); printf("
***-----6> ----***"); printf("
***-----7> ----------***"); printf("
*******************************"); printf("
* :"); scanf("%d",&select); printf("
"); switch(select){ case 1: printf("* :"); PreOrder(tree); printf("
"); break; case 2: printf("* :"); InOrderByStack(tree); printf("
* ( ) :"); InOrder(tree); printf("
"); break; case 3: printf("* :"); PostOrderByStack(tree); printf("
* ( ) :"); PostOrder(tree); printf("
"); break; case 4: Exchange(tree); printf("* !
"); break; case 5: printf("* :%d
", Height(tree)); break; case 6: tree = BuildTree(); break; case 7: printf("* ! !"); return 0; default: printf("* ! !
"); break; } } }

参考資料
(読んだり見たりすることを強くお勧めします!)ツリーの構築方法のまとめ 【データ構造】詳細な説明-ツリー(P 3_ツリーの非再帰的遍歴方式)