트리

빠른 설명

트리는 사이클이 없고 연결된 그래프다. 정점이 개인 트리는 항상 간선이 개다.

언제 쓰는가

  • 부모-자식 관계
  • 계층 구조
  • 루트에서 각 노드까지의 깊이
  • 서브트리 크기 계산

핵심 성질

  • 두 정점 사이의 단순 경로가 정확히 하나다.
  • 정점 개, 간선 개다.
  • DFS/BFS로 쉽게 순회할 수 있다.

참고자료

C++ 코드

#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
 
vector<vector<int>> tree;
vector<int> subtree_size;
 
void dfs(int cur, int parent) {
    subtree_size[cur] = 1;
    for (int next : tree[cur]) {
        if (next == parent) continue;
        dfs(next, cur);
        subtree_size[cur] += subtree_size[next];
    }
}
 
int main() {
    int n = 5;
    tree.assign(n, {});
    subtree_size.assign(n, 0);
 
    tree[0] = {1, 2};
    tree[1] = {0, 3, 4};
    tree[2] = {0};
    tree[3] = {1};
    tree[4] = {1};
 
    dfs(0, -1);
    for (int x : subtree_size) cout << x << ' ';
}

Python 코드

tree = [
    [1, 2],
    [0, 3, 4],
    [0],
    [1],
    [1],
]
subtree_size = [0] * len(tree)
 
def dfs(cur, parent):
    subtree_size[cur] = 1
    for nxt in tree[cur]:
        if nxt == parent:
            continue
        dfs(nxt, cur)
        subtree_size[cur] += subtree_size[nxt]
 
dfs(0, -1)
print(subtree_size)