본문 바로가기

알고리즘/백준

백준 1991 트리순회 - 이진트리와 재귀함수 (C++)

728x90

작년에 배운 자료구조도 오랜만에 복습할겸,

사실 지금 백준은 c++를 공부중이며 짜는 중이라 클래스 개념도 잡을겸

AC받은 코드를 보면서 카피해서 코딩했다.

 

 

전위 순회, 중위 순회 및 후위 순회의 출력 방식은 위에 자세히 설명되어 있고, 왼쪽 오른쪽을 탐색할때, 재귀함수가 필요한 부분은 그때마다 호출해서 출력해주면 된다.

 

나는 자료구조를 자바로 공부해서.. C++ 코드는 얼마나 다를까 봤는데 사실 문법빼곤 다 똑같아서 습득하는데는 얼마 걸리진 않았다. 

나름 처음보고 신기했던(?) 문법은

  • 1. public method를 public: 밑의 인덴트로 설정하는것
  • 2. 클래스 메소드를 부를때는 클래스::메소드(파라미터) 형식

정도.. 

복습하면서 풀기  괜찮았던 문제.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <string>
using namespace std;
class Node {
    string data;
    Node *left, *right;
public:
    Node() { data = ""; left = NULL; right = NULL; }
    void setData(char data) { this->data = data; }
    void setLeft(Node *left) { this->left = left; }
    void setRight(Node *right) { this->right = right; }
    void static preorder(Node *root) { // 전위
        if (root) {
            cout << root->data;
            preorder(root->left);
            preorder(root->right);
        }
    }
    void static inorder(Node *root) { // 중위
        if (root) {
            inorder(root->left);
            cout << root->data;
            inorder(root->right);
        }
    }
    void static postorder(Node *root) { // 후위
        if (root) {
            postorder(root->left);
            postorder(root->right);
            cout << root->data;
        }
    }
};
 
int main(void){
    int n;
    cin>>n;
    Node *node = new Node[n];
    for(int i=0; i<n; i++){
        char data,left,right;
        cin>>data>>left>>right;
        if(data!='.')
            node[(int)(data - 'A')].setData(data);
        if(left!='.')
            node[(int)(data-'A')].setLeft(&node[(int)left-'A']);
        else
            node[(int)(data-'A')].setLeft(NULL);
        if(right!='.')
            node[(int)(data-'A')].setRight(&node[(int)right-'A']);
        else
            node[(int)(data-'A')].setRight(NULL);
    }
    Node *root = &node[0];
    Node::preorder(root);
    cout<<"\n";
    Node::inorder(root);
    cout<<"\n";
    Node::postorder(root);
    cout<<"\n";
}