문제 설명
이 문제는 두 노드의 최소 공통 조상(LCA, Lowest Common Ancestor)을 찾는 문제입니다.
주어진 이진 트리에서 두 개의 노드가 있을 때, 이 두 노드의 공통 조상을 찾는 것입니다.
입력 형식
- 이진 트리의 루트 노드가 주어집니다.
- 두 개의 노드 값이 주어집니다.
출력 형식
- 주어진 두 노드의 최소 공통 조상의 값이나, 없는 경우에는 -1을 출력합니다.
문제 예시
입력: 1 / \ 2 3 / \ 4 5 노드 4와 5의 LCA는 2 입니다. 입력: 1 / \ 2 3 / \ 4 5 노드 4와 3의 LCA는 1 입니다. 입력: 1 / \ 2 3 / \ 4 5 노드 6과 7의 LCA는 -1입니다.
문제 풀이
이 문제를 해결하기 위해 다음과 같은 단계로 접근합니다:
-
이진 트리 구조 정의:
먼저, 트리의 구조를 나타내기 위해 노드 클래스를 정의합니다. 이 클래스는 노드의 값을 갖고,
왼쪽 및 오른쪽 자식 노드를 참조하는 속성을 가집니다. -
재귀적 접근:
최소 공통 조상을 찾기 위해, 트리를 재귀적으로 탐색합니다.
현재 노드가 ${p} 또는 ${q}에 해당되면, 현재 노드를 반환합니다. -
좌우 서브트리 확인:
왼쪽 서브트리 및 오른쪽 서브트리에서 각각 LCA를 찾고, 두 결과가 모두 존재하는 경우
현재 노드가 LCA입니다. -
결과 반환:
두 노드가 발견된 경우 현재 노드를 반환하고, 그렇지 않은 경우null
을 반환합니다.
자바스크립트 코드 구현
// 이진 트리 노드 클래스 정의
class TreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
// 최소 공통 조상 찾기 함수
function findLCA(root, p, q) {
// 베이스 케이스: 현재 노드가 null일 경우
if (root === null) {
return null;
}
// 만약 현재 노드가 p 혹은 q일 경우 현재 노드를 반환
if (root.value === p || root.value === q) {
return root;
}
// 좌측과 우측 서브트리에서 LCA 찾기
const leftLCA = findLCA(root.left, p, q);
const rightLCA = findLCA(root.right, p, q);
// 만약 왼쪽과 오른쪽 모두에서 결과가 존재할 경우 현재 노드가 LCA
if (leftLCA && rightLCA) {
return root;
}
// 하나의 서브트리에서만 LCA를 찾으면 그 결과를 반환
return leftLCA !== null ? leftLCA : rightLCA;
}
// 사용 예시
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);
const node1 = 4;
const node2 = 5;
const lca = findLCA(root, node1, node2);
console.log(lca ? lca.value : -1); // 결과: 2
결론
최소 공통 조상 찾기는 이진 트리에서 중요한 탐색 문제입니다.
다양한 트리 구조와 노드에 대해 재귀적 접근을 통해 효율적인 방법으로 문제를 해결할 수 있습니다.
이 방법은 여러 가지 상황에서 유용하게 사용될 수 있으며,
재귀적 사고와 트리 탐색 이해에 큰 도움을 줄 것입니다.
추가 과제
아래의 추가 과제를 풀어보세요!
- 주어진 노드가 존재하지 않는 경우에 대해 처리하는 로직을 추가하세요.
- 이진 탐색 트리에서 LCA를 찾는 최적화된 방법을 연구하고 구현해보세요.
- 다양한 트리 구조를 시각화할 수 있는 함수도 구현해보세요.