728x90
코드
import java.io.*;
import java.util.Arrays;
public class P_2263 {
static BufferedWriter bw;
static int[] inOrder, postOrder;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
inOrder = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
postOrder = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int root = postOrder[n - 1];
int leftStart = 0, leftEnd = 0, rightStart = 0, rightEnd = n - 1;
for (int i = 0; i < n; i++) {
if (inOrder[i] == root) {
bw.write(root + " ");
if (i != 0) findTree(i, 0, i - 1, 0, i - 1);
if (n - i - 1 != 0) findTree(n - i - 1, i + 1, n - 1, i, n - 2);
break;
}
}
bw.flush();
}
private static void findTree(int length, int inStart, int inEnd, int poStart, int poEnd) throws IOException {
int root = postOrder[poEnd];
bw.write(root + " ");
if (length == 1) return ;
int subLen = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inOrder[i] == root) {
if (subLen != 0) findTree(subLen, inStart, inStart + subLen - 1, poStart, poStart + subLen - 1);
if (length - subLen - 1 != 0) findTree(length - subLen - 1, inStart + subLen + 1, inEnd, poStart + subLen, poEnd - 1);
break;
}
subLen++;
}
}
}
코드 설명
서브트리 혹은 트리의 루트는 항상 postOrder의 마지막에 온다.
이를 기점으로 왼쪽, 오른쪽 서브트리로 생각할 수 있다.
왼쪽 서브트리의 루트는 또 왼쪽 서브트리 postOrder의 마지막 원소이고,
오른쪽 서브트리의 루트는 또 오른쪽 서브트리 postOrder의 마지막 원소가 된다.
또, 이 루트를 기점으로 서브트리의 서브트리를 재귀로 넘겨주면 된다.
처음에는 왼쪽, 오른쪽 서브트리의 inOrder, postOrder를 배열로 만들어서 넘겨주었는데 메모리 초과가 발생해서 인덱스만 넘겨주는 것으로 변경했다.
인덱스를 찾는게 꽤 시간이 오래 걸려서 직접 그려보면서 찾는 게 좋은 것 같다.
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
P.14940 쉬운 최단거리 (0) | 2023.06.24 |
---|---|
P.11444 피보나치 수 6 (0) | 2022.07.18 |
P.1918 후위 표기식 (0) | 2022.07.17 |
P.1167 트리의 지름 (0) | 2022.07.17 |
P.1865 웜홀 (0) | 2022.07.16 |