코딩 테스트 (Python)/리트코드

[리트코드] 110. 균형 이진 트리 (Python)

hihyuk 2024. 1. 12. 15:43
 

Balanced Binary Tree - LeetCode

Can you solve this real interview question? Balanced Binary Tree - Given a binary tree, determine if it is height-balanced.   Example 1: [https://assets.leetcode.com/uploads/2020/10/06/balance_1.jpg] Input: root = [3,9,20,null,null,15,7] Output: true Exam

leetcode.com

문제

입력으로 받은 트리가 균형 트리인지 확인하고 True, False를 출력하라

 

과정

  • 가장 아래 노드부터 0으로 시작해 왼쪽, 오른쪽 노드의 깊이가 얼마나 차이나는지 확인한다.
  • 이때, 균형 트리의 정의에 따라 양쪽 자식 노드에 계산된 값의 차이가 1 초과가 되면 그 트리는 균형 트리가 될 수 없다. 

 

입력

[3,9,20,null,null,15,7]

출력

true

 

풀이

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        def dfs(root):
            if not root:
                return 0
            
            left = dfs(root.left)
            right = dfs(root.right)
            
            if left == -1 or right == -1 or abs(left - right) > 1:
                return -1
            return max(left, right) + 1
        
        return dfs(root) != -1

 

한 줄 씩 해석해보기

def dfs(root):
    if not root:
        return 0
  • dfs 함수에 root를 넣어준다.
  • 만약 root에 값이 없다면 0을 return한다.
    left = dfs(root.left)
    right = dfs(root.right)
  • 가장 아래 노드부터 0으로 시작해 왼쪽, 오른쪽 노드의 깊이가 얼마나 차이나는지 확인한다.
    if left == -1 or right == -1 or abs(left - right) > 1:
        return -1
  • 만약 left가 -1 이거나 right가 -1 또는 left - right의 절대값이 1보다 크다면 -1을 return한다.
  • 양쪽 자식 노드에 계산된 값의 차이가 1 초과가 되면 그 트리는 균형 트리가 될 수 없다. 
    return max(left, right) + 1
  • left와 right 중 가장 큰 값에 1을 더해준다.
return dfs(root) != -1
  • dfs(root)가 -1이 아니면 True를 return한다.