알고리즘
LCA(Lowest Common Ancestor)
탁재민
2024. 4. 13. 11:37
주어진 두 노드의 가장 가까운 공통 조상을 찾는 알고리즘
핵심 요소
- Depth 배열: 각 노드의 깊이(루트에서 해당 노드까지의 거리)를 저장
- Parent 배열: 각 노드의 부모 노드 정보를 저장
프로세스
- Depth 및 Parent 계산: 먼저 트리를 순회하면서 각 노드의 깊이와 부모 노드 정보를 저장(DFS나 BFS 이용)
- LCA 찾기:
- 두 노드의 깊이가 다를 경우, 깊이가 더 깊은 노드를 그의 부모 노드로 올려서 깊이를 일치시킴
- 두 노드의 깊이가 같아지면, 두 노드가 같아질 때까지 각 노드를 그 부모 노드로 이동
- 같아지는 순간의 노드가 LCA
예제
function findLCA(parent, depth, node1, node2) {
// 먼저 두 노드의 깊이를 같게 맞춥니다.
while (depth[node1] !== depth[node2]) {
if (depth[node1] > depth[node2]) {
node1 = parent[node1];
} else {
node2 = parent[node2];
}
}
// 깊이를 맞춘 후, 두 노드가 같아질 때까지 부모 노드로 올라갑니다.
while (node1 !== node2) {
node1 = parent[node1];
node2 = parent[node2];
}
return node1; // 또는 node2, 둘은 이 시점에서 같습니다.
}
// 예제 트리에서의 parent와 depth 정보 (노드 번호는 1부터 시작)
const parent = [0, 0, 1, 1, 2, 2, 3, 3];
const depth = [0, 1, 1, 2, 2, 2, 2];
// LCA 찾기
console.log(findLCA(parent, depth, 4, 5)); // 결과: 2
console.log(findLCA(parent, depth, 4, 6)); // 결과: 1