Inorder, Postorder가 given되었을 때!!! preOrder를 구하기
20 분정도 고민만을 해 보았지만 모르겠었다. 문제 자체의 이해가 아닌 풀이 자체에 전혀 감이 잡히지 않아 이와 관련된 내용을 찾아보았다.
즉 예를들어
2
1 3
4 5 8
6 7 9
ROOT를 중심으로 보면
IN은 LEFT -> ROOT -> RIGHT
POST는 LEFT -> RIGHT -> ROOT
따라서, IN에서 ROOT를 중심으로 LEFT, RIGHT SUBTREE가 나뉘어지고
POST에서는 ROOT앞에, RIGHT TREE가 존재한다.
의 IN : 4 | [1] | 6 [ 5 ] 7 | [2] | 8 9 [3]
의 POST : 4 | 6 7 [5] [1] | 9 8 [3] |[2]
9
4 1 6 5 7 2 8 9 3
4 6 7 5 1 9 8 3 2
// 2 1 4 5 6 7 3 8 9
7
1 2 3 4 5 6 7
1 3 2 5 7 6 4
4
2 6
1 3 5 7
9
7 9 4 2 5 1 3 6 8
9 7 4 5 2 8 6 3 1
//1 2 4 7 9 5 3 6 8
len = in.length;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int[] in = new int[100001];
public static int[] post = new int[100001];
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static StringTokenizer st;
public static int n;
public static Map<Integer,Integer> map = new HashMap<>(); // 특정수와 index를 매핑
public static void setting()throws IOException{
n = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
for (int i=0; i < n; i++) {
in[i] = Integer.parseInt(st.nextToken());
map.put(in[i],i);
}
st = new StringTokenizer(br.readLine());
for (int i=0; i < n; i++) post[i] = Integer.parseInt(st.nextToken());
}
// In 에서 root 위치 찾기
public static int searchRoot(int left, int right, int root){
for(int i=left;i<=right;i++){
if(in[i]==root) return i;
}
return -1;
}
// in 에서의 범위 post에서의 범위
public static void solve(int left,int right,int pleft,int pright){
//System.out.println("left :"+left+", right: "+right);
if(left<0 || right>=n || left>right)
return;
int root = post[pright];
//int rootidx = searchRoot(left,right,root);
int rootidx = map.get(root);
int len = rootidx - left;
System.out.print(in[rootidx]+" ");
solve(left,rootidx-1, pleft,pleft+len-1);
solve(rootidx+1,right, pleft+len,pright-1);
}
public static void main(String[] args)throws IOException {
setting();
solve(0,n-1,0,n-1);
}
}