알고리즘, 코테 준비

백준22856 - 트리순회

Multitab 2022. 10. 6. 11:30

문제링크 : https://www.acmicpc.net/problem/22856
알고리즘 종류 : 트리, 구현
솔? : 답지 보고함
핵심 아이디어 : 기존 중위 순회에서 2배에서 루트 우측 트리의 우측 노드 방문 횟수를 빼누면 된다는 아이디어가 필요하다. 근데 map STL로 트리를 다루는 거도 쉽지 않다..

  • 중위 순회를 구현한다.
  • 계산된 (중위순회 방문횟수)x2 - (우측트리 우특 노드 방문 횟수)
#include <bits/stdc++.h>
using namespace std;

int N, Data, Left, Right;
//최초 노드 카운트는 제외해야하기 때문에 -1로 설정
int cnt = -1, Rcnt = -1;

map<int, pair<int, int>> tree;

void input() {
    scanf("%d", &N);
    for (int i = 1; i <= N; i++) {
        scanf("%d %d %d", &Data, &Left, &Right);
        //Data가 중복되면 알아서 좌우로 들어간다.
        tree[Data].first = Left;
        tree[Data].second = Right;
    }
}
//flag : 루트노드 기준 좌측 트리 우측트리 구분자
void travel(int node, bool flag) {
    //해당노드가 없는 노드라면 함수 리턴
    if (node == -1) return;
    //순회 횟수 증가
    cnt++;
    //좌측 노드 순회
    travel(tree[node].first, 0);
    //우측 노드에 도달했다면 우순회 횟수 증가
    if (flag) {
        //우측트리 우측 노드 방문 횟수 카운트
        Rcnt++;
        travel(tree[node].second, 1);
    }
    else {
        travel(tree[node].second, 0);
    }
}

int main() {
    input();
    travel(1, 1);
    printf("%d", 2 * cnt - Rcnt);
}

후기 : 중위순회부터 짜는 연습을 해야한다니..

잘설명된 링크 : https://comdolidol-i.tistory.com/280

'알고리즘, 코테 준비' 카테고리의 다른 글

알고리즘 종류와 유형  (0) 2022.11.06
백준 1174 - 줄어드는 수  (0) 2022.10.11
백준1068 - 트리  (2) 2022.10.07
백준15486 - 퇴사2  (0) 2022.10.05
백준 14594  (0) 2022.06.23