-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add post '(Leetcode) 124 - Binary Tree Maximum Path Sum'
- Loading branch information
1 parent
68c7856
commit 0134d8c
Showing
3 changed files
with
62 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
--- | ||
layout: post | ||
title: (Leetcode) 124 - Binary Tree Maximum Path Sum | ||
categories: [스터디-알고리즘] | ||
tags: | ||
[자바, java, graph, 그래프, 리트코드, Leetcode, 알고리즘, algorithm, neetcode] | ||
date: 2024-05-01 00:30:00 +0900 | ||
toc: true | ||
--- | ||
|
||
기회가 되어 [달레님의 스터디](https://github.com/DaleStudy/leetcode-study)에 참여하여 시간이 될 때마다 한문제씩 풀어보고 있다. | ||
|
||
[https://neetcode.io/practice](https://neetcode.io/practice) | ||
|
||
--- | ||
|
||
주간 미션을 마쳤기 때문에 시간이 남아서 뒤에서 한문제를 골라 풀기로 하였다. | ||
|
||
[https://leetcode.com/problems/binary-tree-maximum-path-sum/description/](https://leetcode.com/problems/binary-tree-maximum-path-sum/description/) | ||
|
||
이 문제는 hard 문제이다. 굉장히 어려웠다. 아무리 생각해도 효율적인 방법이 생각나지 않아서 솔루션을 확인하였다. 다음에 꼭 다시 풀어봐야겠다. | ||
|
||
## 모범 답안 | ||
|
||
문제에서 어려웠던 부분은 'ㅅ' 모양으로 도 path가 설정될 수 있다는 것이였다. | ||
|
||
문제에서 제공된 binary tree는 위에서 아래로 내려갈수는 있지만 다시 올라갈수는 없는 구조였다. | ||
그래서 root에서 시작해야 한다는 것 정도는 힌트로 얻을 수 있었었다. | ||
|
||
```java | ||
class Solution { | ||
int max = Integer.MIN_VALUE; | ||
|
||
public int maxPath(TreeNode root) { | ||
if(root == null) return 0; | ||
|
||
int value = root.val; | ||
|
||
int left_sum = Math.max(maxPath(root.left),0); | ||
int right_sum = Math.max(maxPath(root.right),0); | ||
|
||
max = Math.max(max, left_sum + right_sum + value); | ||
|
||
return Math.max(left_sum, right_sum) + value; | ||
} | ||
|
||
public int maxPathSum(TreeNode root) { | ||
maxPath(root); | ||
return max; | ||
} | ||
} | ||
``` | ||
|
||
ㅅ 자 모양으로 계산했을 때의 값은 max에 보관한다. 부모 노드에는 왼쪽과 오른쪽 중에서 큰 값과 자신의 값을 더한 값을 전달해준다. 이를 통해서 path가 중복되지 않으면서 계산을 할 수 있다. | ||
|
||
### TC, SC | ||
|
||
시간 복잡도는 O(n)이고, 공간 복잡도는 O(h)이다. h는 트리의 높이이다. 최악의 경우 n이 될수도 있다. (linked list 처럼 한 줄로 연결되는 경우) |