Algorithms
[LeetCode] 124. Binary Tree Maximum Path Sum 풀이 (Java)
작은별._.
2026. 2. 6. 22:26
728x90
반응형
✔️ 오늘의 리트코드 공부 기록 – Binary Tree Maximum Path Sum
문제 요약
이진 트리가 주어질 때, 어떤 경로(Path)의 합이 최대가 되는 값을 구하라.
경로는 부모-자식으로 연결
시작과 끝은 아무 노드 가능
반드시 루트를 지날 필요는 없음
- 문제 링크: https://leetcode.com/problems/binary-tree-maximum-path-sum
💡 사고의 출발점: 경로는 어떻게 생겼을까?
문제를 다시 읽어보자.
“어떤 경로든 상관없다.”
👉 트리에서 경로는 어떤 모양일까?
- 트리는 사이클이 없다.
- 그래서 모든 경로는 반드시 이런 형태다.
왼쪽 어딘가
↑
(정점)
↓
오른쪽 어딘가
즉, 모든 경로는 반드시 하나의 “정점(peak)”을 가진다.
💡 첫 번째 핵심: 현재 노드를 정점으로 가정해보자
만약 현재 노드가 경로의 가장 위(peak)라면?
그 경로는 이렇게 된다.
- left + node + right
왼쪽에서 가장 좋은 경로
현재 노드
오른쪽에서 가장 좋은 경로
이게 바로 global max 후보가 된다.
💡 두 번째 핵심: 부모에게는 무엇을 주어야 할까?
이제 재귀 관점으로 생각해보자.
parent
|
node
/ \
left right
- 부모는 경로를 “이어가야” 한다.
- 그런데 만약 node가 left + node + right를 부모에게 넘기면 어떻게 될까?
그럼 경로는 이렇게 된다.
- left → node → right → parent
여기서 문제가 발생한다.
- node에서 경로가 두 갈래로 갈라진다.
- 경로는 직선이어야 한다.
- Y자 모양이면 안 된다.
그래서 부모에게는 반드시 node + max(left, right) 한 방향만 전달해야 한다.
💡 세 번째 핵심: 왜 0을 고려할까?
다음 질문
만약 left 값이 음수라면?
경로는 선택 사항이다.
그 가지를 “아예 안 쓰는 선택”도 가능하다.
그래서 자연스럽게
- left = Math.max(0, dfs(root.left));
음수 가지는 버린다.
이것은 최대값 문제에서의 합리적인 선택이다.
🧠 사고 흐름 정리
각 노드에서 우리는 동시에 두 가지를 계산한다.
1️⃣ 이 노드가 경로의 정점이라면?
left + node + right → global max 갱신
2️⃣ 이 노드가 부모로 이어지는 통로라면?
node + max(left, right) → 재귀 반환값
✅ 최종 코드 (Java)
class Solution {
int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return maxSum;
}
private int dfs(TreeNode root) {
if (root == null) return 0;
int left = Math.max(0, dfs(root.left));
int right = Math.max(0, dfs(root.right));
// 현재 노드를 경로의 정점으로 사용
maxSum = Math.max(maxSum, left + right + root.val);
// 부모에게 전달할 값 (한 방향만)
return root.val + Math.max(left, right);
}
}
📈 시간 / 공간 복잡도
- 시간: O(N)→ 모든 노드를 한 번씩 방문
- 공간: O(H) → 재귀 스택 깊이 (트리 높이)
📝 이번 문제에서 얻은 진짜 교훈
- 트리 문제는 “경로의 구조”를 먼저 생각하자
- 트리 문제는 항상 서브 트리로 쪼개서 생각하자
- 모든 경로는 반드시 하나의 정점을 가진다
- 최대 문제에서는 음수를 버릴 수 있다는 것을 기억하자
728x90
반응형