124. Binary Tree Maximum Path Sum 두 갈래 트리의 최대 경로 및

5252 단어 #LeetCode

Title


비공 두 갈래 트리를 지정하고 최대 경로와 를 되돌려줍니다.
본고에서 경로는 나무의 임의의 노드에서 출발하여 임의의 노드에 도달하는 서열로 정의되었다.이 경로는 루트 노드를 거치지 않고 하나 이상의 노드를 포함합니다.
예 1:
입력: [1,2,3]
   1
  / \
 2   3

출력: 6
예 2:
입력: [-10,9,20,null,null,15,7]
   -10
   / \
  9  20
    /  \
   15   7

출력: 42

Solve


차례로 돌아가다


먼저 간소화된 함수를 실현하는 것을 고려한다. 이 함수는 두 갈래 트리 중의 한 노드의 최대 공헌치를 계산한다. 구체적으로 말하면 이 노드를 뿌리 노드로 하는 하위 트리에서 이 노드를 기점으로 하는 경로를 찾아 이 경로의 노드 값을 최대로 하는 것이다.
구체적으로 이 함수의 계산 과정은 다음과 같다.
  • 빈 노드의 최대 공헌치는 0이다
  • 비공 노드의 최대 공헌치는 노드 값과 그 하위 노드 중의 최대 공헌치의 합이다

  • 상술한 계산 과정은 귀속적인 과정이기 때문에 루트 노드에 이 함수를 호출하면 각 노드의 최대 공헌치를 얻을 수 있다.
    각 노드의 최대 공헌치를 얻은 후, 두 갈래 트리의 한 노드에 대해 이 노드의 최대 경로와 이 노드의 값과 이 노드의 좌우 하위 노드의 최대 공헌치에 달려 있으며, 만약 하위 노드의 최대 공헌치가 정수라면 이 노드의 최대 경로와 그렇지 않으면 이 노드의 최대 경로와
    전역 변수 maxSum을 유지하여 최대 경로를 저장하고 귀속 과정에서 maxSum의 값을 업데이트합니다. 마지막으로 얻은 maxSum의 값은 두 갈래 트리의 최대 경로와 같습니다.

    Code

    class TreeNode:
    	def __init__(self, x):
    		self.val = x
    		self.left = None
    		self.right = None
    
    
    class Solution:
    	def __init__(self):
    		self.maxSum = float("-inf")
    
    	def maxPathSum(self, root: TreeNode) -> int:
    		def maxGain(node: TreeNode):
    			if not node:
    				return 0
    			leftGain = max(maxGain(node.left), 0)
    			rightGain = max(maxGain(node.right), 0)
    			priceNewPath = node.val + leftGain + rightGain
    			self.maxSum = max(self.maxSum, priceNewPath)
    			return node.val + max(leftGain, rightGain)
    
    		maxGain(root)
    		return self.maxSum
    

    복잡도 분석

  • 시간 복잡도: O(N), 그 중에서 N은 두 갈래 나무의 노드 개수입니다.각 노드에 2회 이상 액세스하지 않음..
  • 공간 복잡도: O(N), 그 중에서 N은 두 갈래 나무의 노드 개수입니다.공간의 복잡도는 주로 귀속 호출 층수에 달려 있다. 최대 층수는 두 갈래 나무의 높이와 같고, 최악의 경우 두 갈래 나무의 높이는 두 갈래 나무의 노드 개수와 같다
  • 좋은 웹페이지 즐겨찾기