Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 유니온 파인드
  • 분할정복
  • 조합론
  • 백준
  • 기하
  • 그래프
  • 동적계획법
  • 정렬
  • 백트래킹
  • C++
  • 트라이
  • 우선순위큐
  • UC++
  • 최소 스패닝 트리
  • 수학
  • 위상 정렬
  • 투포인터
  • 구현
  • KMP
  • 문자열
  • 이분탐색
  • 스택
  • 누적합
  • 브루트포스
  • 트리
  • SCC
  • LCA
  • 세그먼트 트리
  • 정수론
  • 큐

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 1991번 문제
공부 및 정리/백준 코드

[C++]백준 - 1991번 문제

2021. 9. 20. 03:18

1991번: 트리 순회 (acmicpc.net)

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파

www.acmicpc.net

 

1991번 : 트리 순회


이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

 

입력


첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파벳 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현한다.

 

 

출력


첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.

 

 

 


 

생각해 볼 점


전위 순회, 중위 순회, 후위 순위를 차례로 구현합니다.

 

순회는 함수로 구현하였으며, 재귀의 형식으로 진행됩니다.

 

코드


#include <iostream>
using namespace std;
pair<int, int> *bin_tree;

//전위 순회
void pre_order(int current)
{    
    char node = current + 65;
    printf("%c", node);
    int left = bin_tree[current].first;
    int right = bin_tree[current].second;
    if(0 <= left) pre_order(left);
    if(0 <= right) pre_order(right);
}

//중위 순회
void in_order(int current)
{
    char node = current + 65;
    int left = bin_tree[current].first;
    int right = bin_tree[current].second;
    if(0 <= left) in_order(left);
    printf("%c", node);
    if(0 <= right) in_order(right);
}

//후위 순회
void post_order(int current)
{
    char node = current + 65;
    int left = bin_tree[current].first;
    int right = bin_tree[current].second;
    if(0 <= left) post_order(left);
    if(0 <= right) post_order(right);
    printf("%c", node);
}



int main() 
{
    int N;
    cin >> N;
    
    //트리
    bin_tree = new pair<int, int>[N];
    
    //대문자 알파벳 - 65 = int
    for(int i = 0; i < N; i++)
    {
        char node, left, right;
        cin >> node >> left >> right;
        int i_node = node - 65;
        bin_tree[i_node] = make_pair(left - 65, right - 65);
    }
    pre_order(0);
    printf("\n");
    in_order(0);
    printf("\n");
    post_order(0);
    
    
    delete[] bin_tree;
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 14002번 문제  (0) 2021.09.22
[C++]백준 - 1450번 문제  (0) 2021.09.22
[C++]백준 - 1967번 문제  (0) 2021.09.20
[C++]백준 - 1167번 문제  (0) 2021.09.18
[C++]백준 - 11725번 문제  (0) 2021.09.18
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 14002번 문제
    • [C++]백준 - 1450번 문제
    • [C++]백준 - 1967번 문제
    • [C++]백준 - 1167번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바