트리 문제를 풀 때 가장 중요한 것은 "현재 노드가 부모에게 전달해야 할 정보는 무엇인가?"를 결정하는 것입니다.
왼쪽 자식의 보고 + 1오른쪽 자식의 보고 + 10입니다.answer): 현재 노드를 '정점'으로 삼아 왼쪽 경로와 오른쪽 경로를 합친 값이 전체 최댓값(answer)보다 크다면 갱신합니다.Math.max(leftPath, rightPath)를 리턴합니다.class Solution {
int answer;
public int longestUnivaluePath(TreeNode root) {
dfs(root);
return answer;
}
int dfs(TreeNode node) {
if (node == null) return 0;
// 1. 하위 노드로부터 정보 수집 (Bottom-up)
int left = dfs(node.left);
int right = dfs(node.right);
int leftPath = 0;
int rightPath = 0;
// 2. 현재 노드와 자식 노드의 값 비교 및 경로 확장
if (node.left != null && node.left.val == node.val) {
leftPath = left + 1;
}
if (node.right != null && node.right.val == node.val) {
rightPath = right + 1;
}
// 3. 현재 노드를 정점으로 하는 '좌+우' 경로로 최댓값 갱신
answer = Math.max(answer, leftPath + rightPath);
// 4. 부모 노드에게는 한쪽 방향의 최댓값만 전달
return Math.max(leftPath, rightPath);
}
}
answer를 필드 변수로 두어 재귀 과정 중 어느 위치에서든 최댓값이 발견되면 즉시 반영될 수 있도록 설계되었습니다.answer를 갱신하는 식(leftPath + rightPath)과 return하는 식(max(leftPath, rightPath))이 다르다는 점이 이 문제의 가장 높은 허들인데, 이를 깔끔하게 분리하셨습니다.