가장 효율적인 방법은 트리의 리프(Leaf)부터 높이를 재면서 올라오는 것입니다.
max(왼쪽 높이, 오른쪽 높이) + 1을 통해 자신의 높이를 부모에게 보고합니다.|왼쪽 높이 - 오른쪽 높이| > 1인지 확인합니다.-1을 리턴합니다.-1을 리턴했다면, 현재 노드도 계산을 중단하고 즉시 -1을 반환하여 루트까지 불균형 상태를 전파합니다. (조기 종료)public class Solution_Leetcode_110 {
public boolean isBalanced(TreeNode root) {
// 결과가 -1이 아니라면 균형 잡힌 트리
return dfs(root) != -1;
}
private int dfs(TreeNode node) {
if (node == null) {
return 0;
}
// 1. 왼쪽 서브트리 체크
int left = dfs(node.left);
// 2. 오른쪽 서브트리 체크
int right = dfs(node.right);
// 3. 조기 종료 및 균형 판별
// 자식 중 하나라도 불균형(-1)이거나, 현재 위치에서 높이 차가 1 초과인 경우
if (left == -1 || right == -1 || Math.abs(left - right) > 1) {
return -1;
}
// 4. 정상이라면 현재 노드의 높이 반환
return Math.max(left, right) + 1;
}
}
-1 전파 방식이 핵심입니다.-1)으로 설계하여 에러 처리(Error Handling)와 유사한 흐름을 만든 점이 훌륭한 포인트입니다.