1991번: 트리 순회 (acmicpc.net)

## 풀이
문제에서 주어진대로 트리를 만들고
전위 중위 후위 순회 결과를 출력하면 된다

##code
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

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

Node* MakeNode(char root){
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = root;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

void connect(Node* node, Node* add){
    if(node->left != NULL){
        if (node->left->data == add->data){
            free(node->left);
            node->left = add;
        }
        else{
            connect(node->left,add);
        }
    }

    if(node->right != NULL){
        if (node->right->data == add->data){
            free(node->right);
            node->right = add;
        }
        else{
            connect(node->right,add);
        }
    }
}

void preorder(Node* node){
    cout << node->data;
    if(node->left != NULL)
        preorder(node->left);
    if(node->right != NULL)
        preorder(node->right);
}

void inorder(Node* node){
    if(node->left != NULL)
        inorder(node->left);
    cout << node->data;
    if(node->right != NULL)
        inorder(node->right);
}

void postorder(Node* node){
    if(node->left != NULL)
        postorder(node->left);
    if(node->right != NULL)
        postorder(node->right);
    cout << node->data;
}


int main() {
    cin.tie(0); cout.tie(0); // fastio
    ios::sync_with_stdio(0); // fastio
    // 풀이 작성
    int N;
    cin >> N;

    char root,l,r;
    cin >> root >> l >> r;
    Node* Root = MakeNode(root);
        if (l != '.'){
            Node* Left =  MakeNode(l);
            Root->left = Left;
        }
        if (r != '.'){
            Node* Right =  MakeNode(r);
            Root->right = Right;
        }


    for (int i = 0; i < N-1; i++)
    {  
        cin >> root >> l >> r;
        Node* Add = MakeNode(root);
        if (l != '.'){
            Node* Left =  MakeNode(l);
            Add->left = Left;
        }
        if (r != '.'){
            Node* Right =  MakeNode(r);
            Add->right = Right;
        }
        connect(Root,Add);
    }
    preorder(Root);
    cout << endl;
    inorder(Root);
    cout << endl;
    postorder(Root);
    return 0;
}

python으로 하다가 class짜는데 좀 조잡스럽다는 생각도 들고 학교 수업때 c로 해봐서 
c++로 제출해봐야겠다 싶어서 c++로 만들었다
출력부분은 간단한데
만들고 연결하는 부분이 살짝...



#include<bits/stdc++.h>
using namespace std;

int N;
char L[200], R[200];

void Pre(char n) {
    printf("%c",n);
    if(L[n] != '.') Pre(L[n]);
    if(R[n] != '.') Pre(R[n]);
}

void In(char n) {
    if(L[n] != '.') In(L[n]);
    printf("%c",n);
    if(R[n] != '.') In(R[n]);
}

void Post(char n) {
    if(L[n] != '.') Post(L[n]);
    if(R[n] != '.') Post(R[n]);
    printf("%c",n);
}

int main() {
    scanf("%d",&N);
    for(int i=0; i<N; i++) {
        char a,b,c;
        scanf("\n%c %c %c",&a,&b,&c);
        L[a] = b;
        R[a] = c;
    }
    Pre('A');
    printf("\n");
    In('A');
    printf("\n");
    Post('A');
    return 0;
}

다른 사람 풀이인데 보통 c++로 풀면 구조체를 잘 안쓰나
c++로 하다보면 알게되겠지...