Mục lục

Subtree of Another Tree

Sử dụng lại hàm SameTree để kiểm tra một cây có phải là cây con của cây khác không.

Bài toán

Cho hai cây rootsubRoot. Kiểm tra xem subRoot có phải là một cây con (subtree) nằm trong root hay không. Một cây con bao gồm một node và tất cả các hậu duệ của nó.


Phân Tích & Tiếp Cận

Đệ quy kết hợp

Một cây subRoot là cây con của root nếu:

  1. subRoot giống hệt root (dùng hàm isSameTree bài trước để check).
  2. HOẶC subRoot là cây con của root.left.
  3. HOẶC subRoot là cây con của root.right.
typescript:
function isSubtree(root: TreeNode | null, subRoot: TreeNode | null): boolean {
    if (!subRoot) return true; // Cây rỗng luôn là subtree
    if (!root) return false;   // Cây gốc rỗng thì không chứa ai cả

    // Kiểm tra xem giống hệt ngay tại đây không
    if (isSameTree(root, subRoot)) return true;

    // Nếu không, tìm thử ở con trái hoặc con phải
    return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}

// Hàm bổ trợ từ bài trước
function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
    if (!p && !q) return true;
    if (!p || !q || p.val !== q.val) return false;
    return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
  • Time Complexity: $O(n \cdot m)$ - Với mỗi node của cây gốc (n), ta có thể phải duyệt hết cây con (m) để so sánh.
  • Space Complexity: $O(h)$.
Quảng cáo
mdhorizontal