문제 설명
최소 공통 조상(LCA, Lowest Common Ancestor)은 두 노드의 가장 최근 조상 노드를 찾는 문제입니다. 이 문제는 트리 자료구조에서 매우 중요하며, 코딩 테스트 및 면접에서도 자주 출제되는 주제입니다. 이 강좌에서는 자바스크립트를 이용해 LCA를 찾는 방법을 다루고, 실제 알고리즘 문제를 해결하는 과정을 살펴보겠습니다.
문제 정의
주어진 이진 트리와 두 노드 A와 B가 있을 때, 두 노드의 최소 공통 조상을 찾아 반환하는 함수를 작성하세요.
입력 형식
- 노드의 수는
N
이며,1 ≤ N ≤ 10^4
입니다. - 각 노드는 유일한 정수 ID를 가집니다.
- 두 노드의 ID
A
,B
가 주어집니다.
출력 형식
- 두 노드의 최소 공통 조상을 나타내는 노드의 ID를 반환합니다.
예제
예제 1
입력: 트리 구조: 1 / \ 2 3 / \ / \ 4 5 6 7 A = 4, B = 5 출력: 2 // 최소 공통 조상: 2
예제 2
입력: 트리 구조: 1 / \ 2 3 / \ / \ 4 5 6 7 A = 6, B = 7 출력: 3 // 최소 공통 조상: 3
문제 풀이 과정
1. 트리 노드 구조 정의
먼저 이진 트리를 표현하기 위한 노드 구조를 정의해야 합니다. 각 노드는 적어도 부모 노드와 자식 노드에 대한 정보를 가져야 합니다. 자바스크립트에서는 다음과 같은 방식으로 노드 구조를 정의할 수 있습니다.
class TreeNode {
constructor(id) {
this.id = id; // 노드의 ID
this.left = null; // 왼쪽 자식 노드
this.right = null; // 오른쪽 자식 노드
}
}
2. 트리 생성
문제의 예제 트리를 생성해보겠습니다. 아래 코드에서 트리를 구축하는 방법을 보여줍니다.
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
3. 최소 공통 조상 찾기
이제 실제로 LCA를 찾는 함수를 구현합니다. 이진 트리에서 최소 공통 조상을 찾는 일반적인 방법은 재귀적으로 트리를 탐색하면서, 두 노드 A와 B가 발견되는 경우 해당 노드를 반환하는 방식입니다.
function findLCA(root, A, B) {
if (root === null) {
return null;
}
// 현재 노드가 A 또는 B인 경우
if (root.id === A || root.id === B) {
return root;
}
const leftLCA = findLCA(root.left, A, B);
const rightLCA = findLCA(root.right, A, B);
// 양쪽 자식에서 LCA가 발견된 경우, 현재 노드가 LCA
if (leftLCA && rightLCA) {
return root;
}
return leftLCA !== null ? leftLCA : rightLCA;
}
4. 함수 테스트
이제 작성한 LCA 함수를 테스트해봅시다. 다음 코드로 함수를 호출하여 결과를 출력할 수 있습니다.
const A = 4;
const B = 5;
const lcaNode = findLCA(root, A, B);
console.log(`최소 공통 조상: ${lcaNode.id}`); // 출력: 최소 공통 조상: 2
복잡도 분석
이 알고리즘의 시간 복잡도는 O(N)입니다. 여기서 N은 노드의 수입니다. 모든 노드를 한 번씩 방문해야 하기 때문입니다. 공간 복잡도는 O(H)로, H는 트리의 높이입니다. 최악의 경우에는 H가 N에 가까울 수 있습니다 (트리가 편향된 경우).
결론
이번 강좌에서는 자바스크립트를 이용하여 최소 공통 조상을 찾는 방법에 대해 자세히 알아보았습니다. 이 개념은 다양한 트리 관련 문제를 해결하는 데 중요한 기초가 되며, 트리 탐색 알고리즘을 이해하는 데 도움을 줄 것입니다. 실제 코딩테스트나 면접에서 자주 출제되므로 반드시 숙지해두시기 바랍니다. 다음 강좌에서는 다른 트리 관련 문제를 다룰 예정이니 기대해 주세요!