코딩테스트/분할 정복(Divide and Conquer)

[Java] 백준 2263번 : 트리의 순회

sujin7837 2022. 5. 2. 01:33
반응형

문제

n개의 정점을 갖는 이진 트리의 정점에 1부터 n까지의 번호가 중복 없이 매겨져 있다. 이와 같은 이진 트리의 인오더와 포스트오더가 주어졌을 때, 프리오더를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다.

출력

첫째 줄에 프리오더를 출력한다.

예제 입력 1

3
1 2 3
1 3 2

예제 출력 1

2 1 3

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	private static BufferedReader br;
	private static StringTokenizer st;
	
	private static int N, idx=0;
	private static int []inorder, postorder, preorder;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		br=new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(br.readLine());
		inorder=new int[N];
		postorder=new int[N];
		preorder=new int[N];
		
		st=new StringTokenizer(br.readLine());
		for(int i=0;i<N;i++) inorder[i]=Integer.parseInt(st.nextToken());
		st=new StringTokenizer(br.readLine());
		for(int i=0;i<N;i++) postorder[i]=Integer.parseInt(st.nextToken());
		
		getPreorder(0, N-1, 0, N-1, -1);
		for(int i:preorder) System.out.print(i+" ");
	}

	private static void getPreorder(int is, int ie, int ps, int pe, int root) {
		if(is<=ie && ps<=pe) {
			preorder[idx++]=postorder[pe];	// 포스트오더의 맨 마지막 숫자가 루트가 됨
			for(int i=is;i<=ie;i++) {
				if(inorder[i]==postorder[pe]) {
					root=i;
					break;
				}
			}
			getPreorder(is, root-1, ps, ps+root-1-is, root);	// 루트 왼쪽 트리 순회
			getPreorder(root+1, ie, ps+root-is, pe-1, root);	// 루트 오른쪽 트리 순회
		}
	}
}

전위 순회 : V L R

중위 순회 : L V R

후위 순회 : L R V

 

출처 : https://lotuslee.tistory.com/m/82

 

[백준 2263번] 트리의 순회 (java)

2263번: 트리의 순회 첫째 줄에 n(1≤n≤100,000)이 주어진다. 다음 줄에는 인오더를 나타내는 n개의 자연수가 주어지고, 그 다음 줄에는 같은 식으로 포스트오더가 주어진다. www.acmicpc.net 다음과 같

lotuslee.tistory.com

 

반응형