알고리즘/Leetcode

124. Binary Tree Maximum Path Sum - 파이썬

그레고리력 2021. 3. 16. 22:00

문제


풀이


  • 난이도 hard
  • 처음 풀었을 때 틀려서 다시 풀었다.
  • 한 번만 지날 수 있기 때문에 결국 어느 노드에서 left와 right를 모두 포함할지 결정해야 한다.(어느 노드를 root 노드로 할지)
  • path를 이어나가기 위해서는 왼쪽 혹은 오른쪽 중 하나만 선택해야 한다.
  • 따라서 아래 코드를 실행하면 가장 밑에 level부터 cur_max를 갱신하게 된다.
  • 밑에 있는 노드부터 차례로 path값을 계산한 후 path를 잇는 것이 더 값이 크면 이어나간다.

코드


class Solution:
    def maxPathSum(self, root):
        self.cur_max = float('-inf')
        self.maxval(root)
        return self.cur_max

    def maxval(self, root):
        if not root:
            return 0
        # 재귀로 돌아가기 때문에 결국 가장 밑에있는 자식노드부터 값을 체크하게 된다. 
        left = self.maxval(root.left)
        right = self.maxval(root.right)
        # left + root.val + right로 cur_max가 갱신된다면 노드를 이어나간다는 뜻 
        self.cur_max = max(self.cur_max, left + root.val + right)
        # -이면 포함시킬 필요가 없다. 
        return max(root.val + max(left, right), 0)