728x90
https://www.acmicpc.net/problem/1991
1991번: 트리 순회
첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BJ_1991_트리순회 {
static int[][] tree;
static int n;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
tree = new int[n+1][2];
for(int i=1; i<=n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int root = st.nextToken().charAt(0) - 'A' + 1;
int left = st.nextToken().charAt(0) - 'A' + 1;
int right = st.nextToken().charAt(0) - 'A' + 1;
tree[root][0] = left;
tree[root][1] = right;
}
boolean[] visited = new boolean[n+1];
preorder(1, visited);
System.out.println();
visited = new boolean[n+1];
inorder(1, visited);
System.out.println();
visited = new boolean[n+1];
postorder(1, visited);
}//main
private static void preorder(int node, boolean[] visited){
visited[node] = true;
System.out.print((char) (node-1+'A'));
if(tree[node][0]>0 && !visited[tree[node][0]])
preorder(tree[node][0], visited);
if(tree[node][1]>0 &&!visited[tree[node][1]])
preorder(tree[node][1], visited);
}//preorder
private static void inorder(int node, boolean[] visited){
visited[node] = true;
if(tree[node][0]>0 && !visited[tree[node][0]])
inorder(tree[node][0], visited);
System.out.print((char) (node-1+'A'));
if(tree[node][1]>0 &&!visited[tree[node][1]])
inorder(tree[node][1], visited);
}//inorder
private static void postorder(int node, boolean[] visited){
visited[node] = true;
if(tree[node][0]>0 && !visited[tree[node][0]])
postorder(tree[node][0], visited);
if(tree[node][1]>0 &&!visited[tree[node][1]])
postorder(tree[node][1], visited);
System.out.print((char) (node-1+'A'));
}//postorder
}
문제에서 친절히 preorder, inorder, postorder의 순서를 알려줘서 재귀는 어렵지 않게 짤 수 있었다.
(출력을 처음, 중간, 마지막 중 하나로 선택하면 되니까!!)
다만, A, B, C와 index에 관련해서 어떻게 처리할지 고민이 있었다.
빨리 정해서 했으면 됐을텐데 밍기적거림..ㅎ
[Java] 백준 / 트리 순회 / 1991번
문제트리 순회 문제 링크이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.https://www.acmicp
velog.io
이 블로그처럼 class를 따로 만들어 노드를 생성하는 것이 참 깔끔하고 좋은것 같다.
728x90
'코테 > 백준' 카테고리의 다른 글
백준 1735 최단 경로(JAVA) (0) | 2023.02.23 |
---|---|
백준 11053 가장 긴 증가하는 부분 수열(JAVA) (0) | 2023.02.21 |
백준 6064 카잉 달력(JAVA) (0) | 2023.02.17 |
백준 1389 케빈 베이컨의 6단계 법칙(JAVA) (0) | 2023.02.14 |
백준 5525 IOIOI(JAVA) (0) | 2023.02.14 |