Path Sum 두 갈래 트리 경로 및

1646 단어

Easy


두 갈래 나무와 목표 값을 정하고 이 나무가 잎을 따라가는 경로를 포함하는지 판단하며 그 값은 목표 값을 정한다.
Example: 다음 두 갈래 트리와 목표치 22, 5/4 8//11 134/\7 2 1을 True로 되돌려줍니다. 루트 -> 4 -> 11 -> 2의 합이 22이기 때문입니다.
나의 사고방식은 먼저 모든 뿌리부터 잎까지의 합치를 구한 후에 목표치가 포함되어 있는지 쉽게 볼 수 있는 것이다.잎 노드가 몇 개면 몇 개와 값이 있기 때문에bottom-top의 방법은 비교적 적합하고 복잡도는 O(N)에 제어된다
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def hasPathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: bool
        """
        if not root: 
            sums = []
        else:
            sums = self.sums_all(root)
        return sum in sums
        
    def sums_all(self, root):
        if not root.left and not root.right: return [root.val]
        elif root.left and not root.right: return [root.val+x for x in self.sums_all(root.left)]
        elif not root.left and root.right: return [root.val+x for x in self.sums_all(root.right)]
        else: return [root.val+x for x in self.sums_all(root.left)] + [root.val+x for x in self.sums_all(root.right)]

leetcode의 다른 코드의 사고방식을 참고하여 아래의 이 해법이 더욱 간편하고 직접적이라는 것을 발견하였다.top-bottom의 해법이지만 복잡도는 위의 방법보다 더 간단하다. 최악의 경우 O(N)이다.
    def hasPathSum(self, root, sum):
        if not root: return False
        if not root.left and not root.right and root.val == sum: return True
        sum -= root.val
        return self.hasPathSum(root.left, sum) or self.hasPathSum(root.right, sum)

좋은 웹페이지 즐겨찾기