File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed
binary-tree-maximum-path-sum Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change 1+ /*
2+ 풀이
3+ - post order traversal dfs를 활용하여 풀이할 수 있습니다
4+ Big O
5+ - N: node의 개수
6+ - H: Tree의 높이
7+ - Time compleixty: O(N)
8+ - 모든 node를 최대 한 번 탐색합니다
9+ - Space complexity: O(H)
10+ - 재귀 호출 스택의 깊이는 H에 비례하여 증가합니다
11+ */
12+
13+ /**
14+ * Definition for a binary tree node.
15+ * type TreeNode struct {
16+ * Val int
17+ * Left *TreeNode
18+ * Right *TreeNode
19+ * }
20+ */
21+ func maxPathSum (root * TreeNode ) int {
22+ res := root .Val
23+
24+ var maxSubtreeSum func (* TreeNode ) int
25+ maxSubtreeSum = func (node * TreeNode ) int {
26+ // base case
27+ if node == nil {
28+ return 0
29+ }
30+ // left subtree로 내려갔을 때 구할 수 있는 maximum path sum
31+ // left subtree로 path를 내려갔을 때, left subtree가 sum에 기여하는 값이 0보다 작을 경우
32+ // left subtree로는 path를 내려가지 않는 것이 좋음
33+ // 따라서 left < 0 인 경우엔 left = 0
34+ left := maxSubtreeSum (node .Left )
35+ if left < 0 {
36+ left = 0
37+ }
38+ // right subtree도 left subtree와 동일함
39+ right := maxSubtreeSum (node .Right )
40+ if right < 0 {
41+ right = 0
42+ }
43+ // 현재 탐색하고 있는 node의 조상 node를 path에 포함하지 않고도
44+ // maxPathSum이 구해지는 경우가 있음
45+ if res < left + right + node .Val {
46+ res = left + right + node .Val
47+ }
48+ // 현재까지 계산한 subtree path sum을 부모 node에게 전달해야 함
49+ // 현재 node의 부모와 이어지는 path여야 하므로, node.Val + max(left, right)를 반환하면 됨
50+ subTreeSum := node .Val
51+ if left > right {
52+ subTreeSum += left
53+ } else {
54+ subTreeSum += right
55+ }
56+ return subTreeSum
57+ }
58+
59+ maxSubtreeSum (root )
60+ return res
61+ }
You can’t perform that action at this time.
0 commit comments