https://www.acmicpc.net/problem/4256
4256번: 트리
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음
www.acmicpc.net
풀이
전위 순회 : 현재 노드 -> 왼쪽 노드 -> 오른쪽 노드
중위 순회 : 왼쪽 노드 -> 현재 노드 -> 오른쪽 노드
* 전위 순회의 0번째 노드는 현재 노드, 중위 순회 요소에서 현재 노드를 기준으로 왼/오른쪽 노드로 나뉨
위의 2가지 순회로 트리 구조 및 후위 순회 파악 가능

now= 0을 루트로 [0 ~ N]의 범위에 대해 탐색
1. preOrder[now] = 현재 노드
2. preOrder[now] = inOrder[idx]의 위치를 탐색
- inOrder[idx]값을 포함하지 않은 왼쪽 요소들 = 왼쪽 노드에 포함
- inOrder[idx]값을 포함하지 않은 오른쪽 요소들 = 오른쪽 노드에 포함
3. 왼쪽 노드 탐색
- now= now +1, [begin ~ idx - 1]의 범위에 대해 1로 재귀
4. 오른쪽 노드 탐색
- now = (now + idx - begin + 1), [idx+1 ~ end]의 범위에 대해 1로 재귀
* (- begin)을 하는 이유 = now + idx를 할 경우 [0 ~ begin]이 중복되기 때문에

5. 현재 노드 출력
전체 코드
import java.io.*; import java.util.*; public class Main { static int T, N; static int[] preOrder, inOrder; static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); T = Integer.parseInt(st.nextToken()); for (int test = 0; test < T; test++) { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); preOrder = new int[N]; inOrder = new int[N]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { preOrder[i] = Integer.parseInt(st.nextToken()); } st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { inOrder[i] = Integer.parseInt(st.nextToken()); } findPostOrder(0, 0, N - 1); sb.append("\n"); } System.out.println(sb.toString()); } private static void findPostOrder(int rootIdx, int begin, int end) { if(rootIdx>=N) { return; } int rootValue = preOrder[rootIdx]; for (int idx = begin; idx <= end; idx++) { if (rootValue == inOrder[idx]) { findPostOrder(rootIdx + 1, begin, idx); findPostOrder(rootIdx + idx + 1 - begin, idx + 1, end); sb.append(rootValue + " "); return; } } } }
'알고리즘' 카테고리의 다른 글
BOJ 1202 - 보석 도둑(Java) (0) | 2021.12.31 |
---|---|
BOJ 1715 - 카드 정렬하기(Java) (0) | 2021.12.27 |
BOJ 23291 - 어항 정리(Java) (0) | 2021.12.22 |
BOJ 2638 - 치즈(Java) (1) | 2021.12.20 |
ALGOSPOT - Synchronizing Clocks(JAVA) (0) | 2021.12.16 |
댓글