[문제보기]

 1991. 트리 순회

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자

www.acmicpc.net

 

[풀이과정]

이 문제는 트리 문제 중 기본적인 문제로 이진 트리만 형성을 해주고나서 cout 해주는 부분을 첫번째, 두번째, 세번째에 

넣느냐에 따라 전위, 중위, 후위가 나오는 문제이다.

 

1번째 코드는 배열을 사용하여 트리를 만든 코드이고,

2번째 코드는 class와 포인터를 사용하여 만든 코드이다.

 

[소스코드]

#include <iostream>

using namespace std;

int tree[26][2];
int n;

void preorder(int node){
    if(node == -1) return;

    cout << char(node+'A');
    preorder(tree[node][0]);
    preorder(tree[node][1]);
}

void inorder(int node){
    if(node == -1) return;

    inorder(tree[node][0]);
    cout << char(node+'A');
    inorder(tree[node][1]);
}

void postorder(int node){
    if(node == -1) return;

    postorder(tree[node][0]);
    postorder(tree[node][1]);
    cout << char(node+'A');
}

int main(){
    cin >> n;

    for(int i=0; i<n; i++){
        char root, left, right;
        cin >> root >> left >> right;

        tree[(int)(root-'A')][0] = left != '.' ? left-'A' : -1;
        tree[(int)(root-'A')][1] = right != '.' ? right-'A' : -1;
    }
    
    preorder(0);
    cout << "\n";
    inorder(0);
    cout << "\n";
    postorder(0);
    cout << "\n";

    return 0;
}

 


class 사용

#include <iostream>

using namespace std;

class Tree{
    string data;
    Tree *left, *right;

public:
    Tree(){
        data = "";
        left = NULL;
        right = NULL;
    }

    void SetData(char data){
        this->data = data;
    }

    void SetLeft(Tree *left){
        this->left = left;
    }

    void SetRight(Tree *right){
        this->right = right;
    }

    void static preorder(Tree *root){
        if(root){
            cout << root->data;
            preorder(root->left);
            preorder(root->right);
        }
    }

    void static inorder(Tree *root){
        if(root){
            inorder(root->left);
            cout << root->data;
            inorder(root->right);
    }
        }

    void static postorder(Tree *root){
        if(root){
            postorder(root->left);
            postorder(root->right);
            cout << root->data;
        }
    }
};

int main(){
    int N;
    cin >> N;

    Tree *tree = new Tree[N];
    for(int i=0; i<N; i++){
        char data, left, right;
        cin >> data >> left >> right;

        tree[(int)(data-'A')].SetData(data);

        if(left != '.')
            tree[(int)(data-'A')].SetLeft(&tree[(int)(left-'A')]);
        else
            tree[(int)(data-'A')].SetLeft(NULL);

        if(right != '.')
            tree[(int)(data-'A')].SetRight(&tree[(int)(right-'A')]);
        else
            tree[(int)(data-'A')].SetRight(NULL);    
    }

    Tree *root = &tree[0];
    Tree::preorder(root);
    cout << "\n";
    
    Tree::inorder(root);
    cout << "\n";

    Tree::postorder(root);
    cout << "\n";
}

 

[해결 과정 중 실수한 부분]