Skip to content

Commit 628a732

Browse files
committed
feat(soobing): week11 > binary-tree-maximum-path-sum
1 parent 2ce8576 commit 628a732

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* 문제 설명
3+
* - 주어진 이진 트리에서 최대 경로 합을 구하는 문제
4+
*
5+
* 아이디어
6+
* 1) 분할정복 + DFS
7+
* - DFS 아이디어: 각 노드를 루트로 하는 서브트리에서, 해당 노드를 포함한 최대 경로 합을 구해 전역 변수 maxSum을 업데이트한다.
8+
* - 현재 노드 기준의 최대 경로 합은: 현재 노드의 값 + 왼쪽 서브트리에서의 최대 경로 + 오른쪽 서브트리에서의 최대 경로.
9+
* - 하지만 dfs 함수의 반환값은 부모 노드에 연결될 수 있는 일방향 경로이므로,
10+
* '현재 노드의 값 + (왼쪽 또는 오른쪽 중 더 큰 값)'을 반환해야 한다.
11+
*/
12+
13+
/**
14+
* Definition for a binary tree node.
15+
* class TreeNode {
16+
* val: number
17+
* left: TreeNode | null
18+
* right: TreeNode | null
19+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
20+
* this.val = (val===undefined ? 0 : val)
21+
* this.left = (left===undefined ? null : left)
22+
* this.right = (right===undefined ? null : right)
23+
* }
24+
* }
25+
*/
26+
27+
class TreeNode {
28+
val: number;
29+
left: TreeNode | null;
30+
right: TreeNode | null;
31+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
32+
this.val = val === undefined ? 0 : val;
33+
this.left = left === undefined ? null : left;
34+
this.right = right === undefined ? null : right;
35+
}
36+
}
37+
38+
function maxPathSum(root: TreeNode | null): number {
39+
let maxSum = -Infinity;
40+
41+
function dfs(node: TreeNode | null) {
42+
if (!node) return 0;
43+
44+
const leftMaxSum = Math.max(dfs(node.left), 0);
45+
const rightMaxSum = Math.max(dfs(node.right), 0);
46+
const current = leftMaxSum + rightMaxSum + node.val;
47+
maxSum = Math.max(current, maxSum);
48+
49+
return node.val + Math.max(leftMaxSum, rightMaxSum);
50+
}
51+
52+
dfs(root);
53+
54+
return maxSum;
55+
}

0 commit comments

Comments
 (0)