https://www.acmicpc.net/problem/4256
4256번: 트리
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음
www.acmicpc.net
[난이도] Gold4
[유형] 분할정복
[풀이]
preorder 배열에서는 맨 앞의 원소가 root이다.
inorder 배열에서 root값을 찾으면 그 root값을 기준으로 좌측이 left child, 우측이 right child이다.
이 성질을 이용하여, 재귀함수로 left child, right child의 preoder,inorder 각각의 배열에서의 범위를 전달하는 방식으로 답을 구한다.
#include <cstdio> int tc,N,pre[1001],in[1001]; void post(int lp,int rp,int li,int ri){ if(lp>rp) return; if(lp==rp) { printf("%d ",pre[lp]); return; } int root = pre[lp]; int idx=li; for(int i=li;i<=ri;i++){ if(root==in[i]){ idx=i; break; } } int lcnt = idx-li; post(lp+1,lp+lcnt,li,idx-1); post(lp+lcnt+1,rp,idx+1,ri); printf("%d ",pre[lp]); } int main(){ scanf("%d",&tc); while(tc--){ scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d",&pre[i]); for(int i=0;i<N;i++) scanf("%d",&in[i]); post(0,N-1,0,N-1); puts(""); } }
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/4256.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 2812 : 크게 만들기 (C++) (0) | 2021.04.25 |
---|---|
[BOJ/백준][Gold5] 1405 : 미친 로봇 (C++) (0) | 2021.04.25 |
[BOJ/백준][Gold5] 2023 : 신기한 소 (C++) (0) | 2021.04.25 |
[BOJ/백준][Gold5] 11000 : 강의실 배정 (C++) (0) | 2021.04.25 |
[BOJ/백준][Gold5] 2660 : 회장뽑기 (C++) (0) | 2021.04.25 |