본문 바로가기

코딩테스트(Coding Test)/백준(Baekjoon OJ)

백준 1991 - 트리 순회

문제링크 : https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.

www.acmicpc.net

 

Note
이 문제를 풀기위한  설명은 트리(Tree)와  이진트리(Binary Tree)  POST를 참고하면 된다.
첫 번째는 줄에는 노드의 개수이고 그 다음줄 부터 하나씩 읽어가면서 노드 , 왼쪽 자식노드, 오른쪽 자식노드 순으로 노드를 추가하면서 이진트리를 그성하고 pre-order, in-order, post-porder 순으로 순회하여 결과를 출력하면 된다.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
 
 
 
public class Main {
 
    public static class BTree<extends Comparable<T>> {
 
        public Node root;
 
        public static class Node<extends Comparable<T>> {
            public T data  ; // 노드의 값.
            public Node<T> parent  ; // 부모 노드를 가리킨다.
            public Node<T> left ; // 왼쪽 자식노드 (left child node)
            public Node<T> right  ; // 오른쪽 자식노드(right child node)
 
            Node(T data) {
                this.data = data;
            }
 
            public Node(Node<T> parent, T data ) {
                this.data = data;
                this.parent = parent;
                this.left = null;
                this.right = null;
            }
        }
 
        public Node addLeft(Node parent, T data) {
            Node node = new Node(parent, data);
            parent.left = node;
            return node;
        }
 
        public Node addRight(Node parent, T data) {
            Node node = new Node(parent, data);
            parent.right = node;
            return node;
        }
 
        public Node search(T data) {
            // level order 로 찾는다.
 
            if(root == null) {
                return null;
            }
 
            final Queue<Node> queue = new ArrayDeque<>();
            queue.add(root);
 
            while(!queue.isEmpty()) {
                Node node = queue.poll();
                if(node.data.compareTo(data) == 0) {
                    return node;
                }
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            return null;
        }
 
        public void preorderTraversal(Node node, Consumer<Node> consumer) {
            if(node == null)
                return;
 
            if(consumer != nullconsumer.accept(node);
            preorderTraversal(node.left, consumer);
            preorderTraversal(node.right, consumer);
        }
 
        public void inorderTraversal(Node node, Consumer<Node> consumer) {
            if(node == null)
                return;
 
            // left -> root -> right
            inorderTraversal(node.left, consumer);
            if(consumer != nullconsumer.accept(node);
            inorderTraversal(node.right, consumer);
        }
 
        public void postorderTraversal(Node node, Consumer<Node> consumer) {
            if(node == null)
                return;
 
            // left -> right -> root
            postorderTraversal(node.left, consumer);
            postorderTraversal(node.right, consumer);
            if(consumer != nullconsumer.accept(node);
 
        }
 
    }
 
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        BTree btree = new BTree();
 
        for(int i = 0 ; i < N ; i++) {
            String[] nodes = br.readLine().split(" ");
 
            BTree.Node node = btree.root == null ?
                    btree.root = new BTree.Node(nodes[0]) :
                    btree.search(nodes[0]) ;
 
            if(!nodes[1].equals(".")) btree.addLeft(node, nodes[1]);
            if(!nodes[2].equals(".")) btree.addRight(node, nodes[2]);
        }
 
 
        StringBuilder builder = new StringBuilder();
 
        btree.preorderTraversal(btree.root, new Consumer<BTree.Node>() {
            @Override
            public void accept(BTree.Node node) {
                builder.append(node.data);
            }
        });
        builder.append("\n");
 
        btree.inorderTraversal(btree.root, new Consumer<BTree.Node>() {
            @Override
            public void accept(BTree.Node node) {
                builder.append(node.data);
            }
        });
        builder.append("\n");
 
        btree.postorderTraversal(btree.root, new Consumer<BTree.Node>() {
            @Override
            public void accept(BTree.Node node) {
                builder.append(node.data);
            }
        });
        builder.append("\n");
 
        System.out.println(builder.toString());
    }
 
}
Colored by Color Scripter