단순히 한 시점의 비교가 아니라, 순회 과정에서 모든 인접한 노드 간의 거리를 측정하는 것이 전략입니다.
Left -> Root -> Right 순서로 방문하면 모든 노드 값은 오름차순 수열이 됩니다.prev)에 방문하게 됩니다.prev로 두고 바로 다음에 방문하게 됩니다.public class Solution_Leetcode_783 {
// 이전 노드의 값을 저장하여 연속적인 비교 흐름을 유지
private Integer prev = null;
// 탐색 과정에서 발견된 최소 차이를 실시간 갱신
private int min = Integer.MAX_VALUE;
public int minDiffInBST(TreeNode root) {
inorder(root);
return min;
}
private void inorder(TreeNode node) {
if (node == null) {
return;
}
// 1. 왼쪽 서브트리 끝까지 탐색
inorder(node.left);
// 2. 현재 노드와 직전 노드(왼쪽 서브트리의 최댓값) 비교
if (prev != null) {
// 정렬된 흐름 속에서 인접한 두 값의 차이를 추출
min = Math.min(min, node.val - prev);
}
// 현재 노드 값을 다음 노드 비교를 위한 '직전 값'으로 전달
prev = node.val;
// 3. 오른쪽 서브트리 탐색 (이 과정에서 현재 노드는 오른쪽 자식의 prev가 됨)
inorder(node.right);
}
}
왼쪽 서브트리의 우측 끝(최댓값) -> 루트 -> 오른쪽 서브트리의 좌측 끝(최솟값) 순으로 흐릅니다. 이 과정에서 루트는 자신의 양옆 서브트리와 가장 가까운 값들을 모두 한 번씩 만나게 됩니다.prev 멤버 변수는 재귀의 층위를 무시하고 오직 방문 순서에만 의존합니다. 이는 트리의 복잡한 구조를 단 하나의 일관된 선형 데이터 흐름으로 치환하여 문제를 단순화하는 강력한 도구가 됩니다.