BOJ2263

백준 2263: 트리의 순회

Link: https://www.acmicpc.net/problem/2263

풀이

  • Inorder와 Postorder를 보고 preorder를 출력하는 문제
  • image
    • 해당 그림과 같은 배열이 주어진다면
    • head를 기준으로 left와 right로 분리 가능
    • postorder의 가장 오른쪽 노드가 처음 head
    • image
  • left와 right를 나누어 재귀를 통해 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
	static int N;
	static int[] in;
	static int[] post;
	static int[] idx;
	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());
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
		//inorder를 저장한 배열
		in = new int[N+1];
		//postorder를 저장한 배열
		post = new int[N+1];
		
		//inorder의 인덱스를 저장하는 배열
		idx = new int[N+1];
		for (int i = 1; i <= N; i++) {
			in[i] = Integer.parseInt(st.nextToken());
			post[i] = Integer.parseInt(st1.nextToken());
			idx[in[i]] = i;
		}
		pre(1,N,1,N);
		System.out.println(sb);
		
	}
	
	//head를 기준으로 inorder와 postorder배열을 나누어 탐색
	static void pre(int il,int ir, int pl, int pr) {
		
		//범위를 벗어나면 탈출
		if(il>ir)return;
		//head를 출력
		sb.append(post[pr]).append(" ");
		//head의 인덱스
		int head = idx[post[pr]];
		int lsize = head-il;
		int rsize = ir-head;
		//left 
		pre(il,head-1,pl,pl+lsize-1);
		//right
		pre(head+1,ir, pr-rsize,pr-1);
	}
	
	
	

}

Issue

  • 처음에 left와 right의 인덱스를 잘못 잡아서 시간이 오래걸림

Leave a comment