알고리즘 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와 비교해서 넣어야되지? 그냥 계속 최댓값 갱신 아닌가 라고 생각했는데
각 노드를 기준으로 왼쪽 오른쪽 길이를 비교하는 거여서 루트노드의 왼쪽+오른쪽이 항상 길라는 법이 없었다!