m1ndy5's coding blog

LeetCode 543. Diameter of Binary Tree with Python 본문

알고리즘 with python/알고리즘 스터디

LeetCode 543. Diameter of Binary Tree with Python

정민됴 2024. 1. 12. 10:37

https://leetcode.com/problems/diameter-of-binary-tree/description/

어려웠던 문제ㅠㅠ 잘 몰라서 책보고 풀었다.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        longest = [0]

        # 가운데 노드 기준
        def dfs(node):

            if not node:
                return -1

            # 왼쪽에 최대 몇개, 오른쪽에 최대 몇개 -> 자식 없으면 -1, 1개면 0, ...
            left = dfs(node.left)
            right = dfs(node.right)

            # 꼭 루트기준이 아니기 때문에 기존 longest에 저장된 값이랑 비교해 봐야함
            longest[0] = max(longest[0], left + right + 2)

            # 왼쪽에서 온게 더 긴지 오른쪽에서 온게 더 긴지
            return max(left, right) + 1

        dfs(root)
        return longest[0]

이 문제에서 키포인트는 꼭 루트를 훑지 않아도 된다는 것이었다.
처음에 어짜피 더 긴게 저장되는데 왜 longest를 기존에 있던 longest와 비교해서 넣어야되지? 그냥 계속 최댓값 갱신 아닌가 라고 생각했는데
각 노드를 기준으로 왼쪽 오른쪽 길이를 비교하는 거여서 루트노드의 왼쪽+오른쪽이 항상 길라는 법이 없었다!