출처: https://3months.tistory.com/307 [Deep Play]

백준/Tree

[BOJ] 4256 트리 C++

코딩하는 랄뚜기 2021. 8. 11. 13:47

https://www.acmicpc.net/problem/4256

 

4256번: 트리

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음

www.acmicpc.net

이진트리에서 전위순회와 중위 순회가 주어졌을 때, 후위 순회를 구하는 문제이다. 저번에 후위 순회와 중위 순회가 주어졌을 때 전위 순회를 구하는 문제를 풀어서 쉽게 풀 수 있었다.

https://coderecord.tistory.com/5

 

[BOJ] 2263 트리의 순회 C++

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

coderecord.tistory.com

위 글과 비교했을 때, 인자 값만 바뀌었으므로 위 글을 참조하면 된다.

 

코드

#include <iostream>
using namespace std;
int T,N;
int preorder[1000];
int inorder[1000];

void find_postorder(int in_start,int in_end,int pre_start, int pre_end){
    if(in_start>in_end||pre_start>pre_end) return;
    int mid_idx;
    for(int i=in_start;i<=in_end;i++){
        if(preorder[pre_start]==inorder[i]){
            mid_idx=i;
            break;
        }
    }
    find_postorder(in_start,mid_idx-1,pre_start+1,pre_start-in_start+mid_idx);
    find_postorder(mid_idx+1,in_end,pre_start-in_start+mid_idx+1,pre_end);
    cout<<inorder[mid_idx]<<" ";
}
int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>T;
    while(T--){
        cin>>N;
        for(int i=0;i<N;i++) cin>>preorder[i];
        for(int i=0;i<N;i++) cin>>inorder[i];
        find_postorder(0,N-1,0,N-1);
        cout<<'\n';
    }
    return 0;
}

'백준 > Tree' 카테고리의 다른 글

[BOJ] 5639 이진 검색 트리  (0) 2022.02.18
[BOJ] 11812 K진 트리 C++  (0) 2021.08.13
[BOJ] 19581 두 번째 트리의 지름 C++  (0) 2021.08.09
[BOJ] 1167 트리의 지름 C++  (0) 2021.08.09
[BOJ] 1655 가운데를 말해요 C++  (0) 2021.08.05