[c++] 부분 트리 확인(Subtree Check)
이번에는 부분 트리 확인(Subtree Check) 알고리즘에 대해 알아보겠습니다. 부분 트리 확인은 이진 트리에서 한 트리가 다른 트리의 부분 트리인지를 확인하는 알고리즘입니다.
부분 트리 확인 알고리즘
부분 트리 확인 알고리즘은 두 단계로 이루어집니다.
- 첫 번째 단계에서는 두 트리에서 같은 값을 가진 노드를 찾습니다. 이때, 대상 트리 (큰 트리)를 순회하면서, 각 노드에 대해 재귀적으로 두 번째 단계로 이동합니다.
- 두 번째 단계에서는 대상 트리와 입력 트리 (작은 트리)의 현재 노드가 같은 값을 가지고 있는지를 확인하고, 만약 값이 같다면 각 노드의 좌우 하위 트리에 대해 재귀적으로 이동합니다.
다음은 이를 구현한 C++ 코드 예시입니다.
#include <iostream>
struct Node {
int data;
Node* left;
Node* right;
};
bool isIdentical(Node* s, Node* t) {
if (s == nullptr && t == nullptr) return true;
if (s == nullptr || t == nullptr) return false;
return (s->data == t->data) && isIdentical(s->left, t->left) && isIdentical(s->right, t->right);
}
bool isSubtree(Node* s, Node* t) {
if (s == nullptr) return false;
if (isIdentical(s, t)) return true;
return isSubtree(s->left, t) || isSubtree(s->right, t);
}
위 코드는 입력 트리 t
가 대상 트리 s
의 부분 트리인지를 확인하는 함수를 보여줍니다.
결론
부분 트리 확인 알고리즘은 효율적인 방법으로 두 이진 트리가 서로 관련되어 있는지를 확인할 수 있는 중요한 알고리즘입니다. C++을 사용하여 간단하게 구현할 수 있으며, 재귀적인 방식으로 구현되어 있어 이해하기 쉽습니다.
참고 자료
- GeeksforGeeks, “Check if a binary tree is subtree of another binary tree”, https://www.geeksforgeeks.org/check-binary-tree-subtree-another-binary-tree/