1. 문제
https://www.acmicpc.net/problem/2263
2263번: 트리의 순회
첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.
www.acmicpc.net
2. 접근방법
중위순회와 후위순회를 보고 전위순회를 구하는 문제
중위와 후위순회의 특성을 확인하면 전위순회를 구할 수 있다.
1. 후위 순회의 맨끝은 루트노드이다.
2. 중위 순회는 루트노드를 기준으로 왼쪽 서브트리, 오른쪽 서브트리로 나눌 수 있다.
3. 1,2의 특성을 이용해 분할정복으로 루트 출력 -> 왼쪽 서브트리 -> 오른쪽 서브트리를 반복한다.
4. 끝
3. 자바 코드
package Gold;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class G3_2263트리의순회 {
static int inOrder[], postOrder[], n;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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();
go(0,0,n);
System.out.println(sb);
}
static void go(int inStart,int postStart, int size) {
if(size <1)
return;
int root = postOrder[postStart+size-1];
sb.append(root+" "); //중
if(size == 1)
return;
int idx = 0;
for(int i = inStart ; i < inStart+size; i++ ) {
if(inOrder[i] == root) {
idx = i;
break;
}
}
int preSize = idx-inStart;
go(inStart,postStart,preSize); //좌
go(inStart+preSize+1,postStart+preSize,size-preSize-1); //우
}
}
4. 마치며
이전 전위 중위를 보고 후위순회를 찾는 문제와
비슷한 방식의 풀이였다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 2357 최솟값과 최댓값 (0) | 2021.11.02 |
---|---|
[백준] 2250 트리의 높이와 너비 (0) | 2021.11.01 |
[백준] 9489 사촌 (0) | 2021.10.27 |
[백준] 4256 트리 (0) | 2021.10.22 |
[백준] 3584 가장 가까운 공통 조상 (0) | 2021.10.21 |