[Leetcode] 110. Balanced Binary Tree

2024. 11. 22. 09:25·BE/algorithm

문제

  • 관련 토픽: DFS, Binary Tree, Tree
  • 난이도: Easy
  • 링크: https://leetcode.com/problems/balanced-binary-tree/description/

요구사항

  • 주어진 Binary Tree가 height balanced 인 상태인지 확인
    • height balanced = 두 서브트리의 높이의 차이가 1이상이 아닌 트리

조건

  • 노드 개수 범위 [0, 5000]
  • 10^4 <= node.val <= 10^4 -> O(N) 시간복잡도 이전으로 풀어야 한다

풀이

  • 모든 노드의 왼쪽 서브트리와 오른쪽 서브트리의 높이 차이를 확인
  • 높이 차이가 1을 초과하면, 트리는 불균형하다고 판단, return False
  • DFS방식으로 각 노드의 서브트리 높이를 계산하며 균형여부를 확인
  • Stack으로 DFS를 풀이하니, 각 노드에 방문했는지 여부를 저장하는 visited 배열 필요
  • 현재 노드의 왼쪽 서브트리, 오른쪽 서브트리의 높이를 확인해야하기 때문에 (재귀의 경우는 반환값으로), heights라는 배열 필요
  • 방문한 곳의 왼쪽 서브트리, 오른쪽 서브트리의 높이의 값을 확인하고 비교
    • 높이 차이를 초과하면, False
    • 초과하지 않는다면, 현재 왼쪽 서브트리, 오른쪽 서브트리의 높이에 + 1한 값을 현재 노드의 높이로 heights 배열에 저장

시간복잡도, 공간복잡도

  • 시간 복잡도: 모든 노드에 한번씩 방문 O(N)
  • 공간 복잡도: 스택에 저장되는 노드의 최대 개수 = 높이 O(H)

코드

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True

        stack = [(root, False)]
        heights = {}

        while stack:
            node, visited = stack.pop()

            if not node:
                continue

            if visited:
                leftHeight = heights.get(node.left, 0)
                rightHeight = heights.get(node.right, 0)

                if abs(leftHeight - rightHeight) > 1:
                    return False

                heights[node] = max(leftHeight, rightHeight) + 1
            else:
                stack.append((node, True))
                stack.append((node.left, False))
                stack.append((node.right, False))
        return True
저작자표시 비영리 변경금지 (새창열림)

'BE > algorithm' 카테고리의 다른 글

[Leetcode] 121. Best Time to Buy and Sell Stock  (7) 2024.11.14
[Leetcode] 21. Merge Two Sorted Lists + 그림 풀이  (1) 2024.11.13
[LeetCode] 347. Top K Frequent Elements  (0) 2023.01.04
[LeetCode] 49. Group Anagrams  (0) 2023.01.03
[LeetCode] 1. Two Sum  (0) 2023.01.03
'BE/algorithm' 카테고리의 다른 글
  • [Leetcode] 121. Best Time to Buy and Sell Stock
  • [Leetcode] 21. Merge Two Sorted Lists + 그림 풀이
  • [LeetCode] 347. Top K Frequent Elements
  • [LeetCode] 49. Group Anagrams
bandal-gom
bandal-gom
Devops & Backend Developer | tech blog
  • bandal-gom
    yayz's devlog
    bandal-gom
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • DevOps (22)
        • devops (4)
        • cicd (2)
        • docker (2)
        • monitoring (2)
        • nginx (4)
        • cache (1)
        • aws (1)
        • etc (6)
      • BE (21)
        • BE (3)
        • design pattern (1)
        • data structure (0)
        • spring (1)
        • algorithm (12)
      • devlog (24)
        • TIL (17)
        • programming language (2)
        • conference (2)
        • etc (3)
      • IT Review (1)
  • 블로그 메뉴

    • about.
    • 개발👩‍💻
    • etc.
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    java
    homelab
    개발자취업
    Python
    알고리즘
    til
    오블완
    jenkins
    algorithm
    모각코
    Kotlin
    노트북하기좋은카페
    키캡
    항해99
    키보드케이블
    time complexity
    99클럽
    티스토리챌린지
    leetcode 347
    hash
    젠킨스
    알고리즘문제풀이
    Programmers
    array
    코딩테스트준비
    릿코드
    NGINX
    문제풀이
    프로그래머스
    LeetCode
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
bandal-gom
[Leetcode] 110. Balanced Binary Tree
상단으로

티스토리툴바