Cây

huunguyen huunguyen Updated Tháng 9. 29, 2026 Đọc 4 phút 3 lượt xem

Cây là đồ thị liên thông không có chu trình với N đỉnh và N−1 cạnh.

Khái niệm cơ bản

Cây có gốc (rooted tree) là cây trong đó một đỉnh được chọn làm gốc.

  • Cha (parent): đỉnh liền kề gần gốc hơn
  • Con (children): các đỉnh liền kề xa gốc hơn
  • Lá (leaf): đỉnh không có con
  • Độ sâu (depth): khoảng cách từ gốc, depth[root]=0
  • Chiều cao (height): độ sâu lớn nhất trong cây
  • Cây con của u (subtree): gồm u và toàn bộ hậu duệ của u

Duyệt cây (DFS)

const int MAXN = 2e5 + 5;
vector<int> adj[MAXN];
int par[MAXN], dep[MAXN];

void dfs(int u, int p) {
    par[u] = p;
    for (int v : adj[u])
        if (v != p) {
            dep[v] = dep[u] + 1;
            dfs(v, u);
        }
}
// dep[root] = 0; dfs(root, -1);

DFS in/out time (Euler Tour)

Gán thời điểm vào tin[u] và ra tout[u] khi DFS thì cây con của u trở thành đoạn liên tục [tin[u], tout[u]] trên mảng, nên truy vấn/cập nhật cây con quy về truy vấn đoạn với Fenwick hoặc Segment Tree. Chi tiết (kiểm tra tổ tiên, truy vấn đường đi gốc-đỉnh, các dạng Euler tour, DFS không đệ quy): xem trang Euler tour trên cây.

Đường kính cây

Đường đi dài nhất giữa hai đỉnh bất kỳ. Tìm bằng hai lần BFS:

  1. BFS từ đỉnh bất kỳ → tìm đỉnh xa nhất u
  2. BFS từ u → tìm đỉnh xa nhất v
  3. Đường kính = dist(u,v)
pair<int,int> farthest(int src, int n) {
    vector<int> dist(n+1, -1);
    queue<int> q;
    q.push(src); dist[src] = 0;
    int far = src;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int v : adj[u])
            if (dist[v] == -1) {
                dist[v] = dist[u] + 1;
                q.push(v);
                if (dist[v] > dist[far]) far = v;
            }
    }
    return {far, dist[far]};
}

auto [u, d1]       = farthest(1, n);
auto [v, diameter] = farthest(u, n);

Tổ tiên chung thấp nhất (LCA)

LCA(u,v) là tổ tiên chung sâu nhất của u và v; khoảng cách hai đỉnh là dep[u]+dep[v]−2dep[LCA(u,v)]. Các cách tính (binary lifting, Euler tour + sparse table cho truy vấn O(1), Tarjan offline) và ứng dụng (tổng trên đường đi, hiệu trên cây): xem trang Tổ tiên chung thấp nhất (LCA). Cài đặt binary lifting chi tiết: Binary Lifting.

Các trang chi tiết: lộ trình học

Nhóm Cây gồm 18 trang con. Gợi ý thứ tự học từ nền tảng đến nâng cao:

1. Cấu trúc nền tảng (học trước tiên)
Trang Mục đích chính Độ phức tạp
Heap / Hàng đợi ưu tiên Lấy min/max động, hàng đợi ưu tiên O(logN)/thao tác
Cây nhị phân tìm kiếm (BST) Tập hợp có thứ tự (set/map) O(logN) trung bình
Fenwick Tree (BIT) Prefix sum + cập nhật điểm O(logN)
Segment Tree Truy vấn + cập nhật đoạn (lazy) O(logN)
Trie Lưu/tìm xâu; 01-Trie cho XOR O(‖s‖)
2. BST cân bằng / nâng cao
Trang Mục đích chính
Treap BST ngẫu nhiên, split/merge, implicit treap
Splay Tree BST tự cân bằng amortized, thao tác trên dãy
3. Kỹ thuật truy vấn trên cây
Trang Mục đích chính
Euler tour trên cây Duỗi cây thành mảng, truy vấn cây con bằng BIT/Segment Tree
LCA Tổ tiên chung thấp nhất: binary lifting, Euler tour + RMQ, Tarjan offline
Binary Lifting LCA, tổ tiên thứ k, O(logN)/truy vấn
Heavy-Light Decomposition Truy vấn/cập nhật trên đường đi
Centroid Decomposition Đếm/đường đi theo phân rã trọng tâm
DSU on Tree Gộp thông tin cây con (small-to-large)
Virtual Tree Nén cây theo tập đỉnh quan trọng
4. Segment Tree nâng cao
Trang Mục đích chính
Persistent Segment Tree Truy vấn lịch sử, k-th trên đoạn
Segment Tree Beats Cập nhật min/max trên đoạn
Li Chao Tree Bao lồi đường thẳng, tối ưu DP
5. Cây động
Trang Mục đích chính
Link-Cut Tree Rừng cây động, link/cut, truy vấn đường đi
Trang này có hữu ích không? Đăng nhập để trả lời

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0