Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 이진 트리가 완전 이진 트리인지 확인하는 방법

완전 이진 트리(Complete Binary Tree)란?

이진 트리가 하나 주어졌을 때, 이 트리가 완전 이진 트리인지 아닌지를 판별하는 프로그램을 만들어 보겠습니다.

완전 이진 트리는 다음 조건을 만족하는 트리입니다.

  • 마지막 레벨을 제외한 모든 레벨이 노드로 가득 차 있어야 합니다.
  • 마지막 레벨의 노드들은 가능한 한 왼쪽에 몰려 있어야 합니다.

예를 들어 아래와 같은 트리가 입력으로 주어지면, 모든 노드가 왼쪽부터 차례대로 채워져 있으므로 출력 결과는 True가 됩니다.

Python으로 이진 트리가 완전 이진 트리인지 확인하는 방법

해결 전략: BFS(레벨 순회) 활용

이 문제는 큐(queue)를 이용한 너비 우선 탐색(BFS)으로 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 레벨 순서대로 노드를 방문하다가 처음으로 빈(null) 자리를 만나면, 그 이후에는 어떤 노드도 등장해서는 안 된다는 것입니다.

알고리즘 단계

  1. 양방향 큐(deque)를 하나 생성합니다.
  2. 루트 노드를 큐의 끝에 삽입합니다.
  3. 플래그(flag)를 False로 초기화합니다. (아직 빈 자리를 만나지 못했음을 의미)
  4. 큐가 빌 때까지 다음 과정을 반복합니다.
    • 큐의 왼쪽에서 요소를 꺼내 temp에 저장합니다.
    • temp가 null이라면 → flag를 True로 설정합니다.
    • flag가 이미 설정된 상태에서 temp가 null이 아니라면 → 완전 이진 트리가 아니므로 False를 반환합니다.
    • 그 외의 경우 → temp의 왼쪽 자식과 오른쪽 자식을 큐 끝에 삽입합니다.
  5. 반복이 정상적으로 끝나면 True를 반환합니다.

Python 구현 예제

from collections import deque

class TreeNode:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

class Solution:
    def solve(self, root):
        q = deque()
        q.append(root)
        flag = False
        while q:
            temp = q.popleft()
            if not temp:
                flag = True
            elif flag and temp:
                return False
            else:
                q.append(temp.left)
                q.append(temp.right)
        return True

ob = Solution()
root = TreeNode(9)
root.left = TreeNode(7)
root.right = TreeNode(10)
root.left.left = TreeNode(6)
root.left.right = TreeNode(8)
print(ob.solve(root))

입력

root = TreeNode(9)
root.left = TreeNode(7)
root.right = TreeNode(10)
root.left.left = TreeNode(6)
root.left.right = TreeNode(8)

출력

True

동작 원리 살펴보기

위 예제 트리에서 BFS는 노드를 9 → 7 → 10 → 6 → 8 순서로 방문합니다. 이 과정에서 null 노드가 한 번도 등장하지 않았기 때문에 flag는 끝까지 False로 유지되며, 최종적으로 True가 반환됩니다.

반대로, 오른쪽 자식만 존재하고 왼쪽 자식이 비어 있는 노드가 있다면 큐에 null이 먼저 들어간 뒤 실제 노드가 뒤따르게 되고, 이 시점에 flag가 이미 True이므로 즉시 False가 반환됩니다.

복잡도 분석

  • 시간 복잡도: O(n) — 모든 노드를 정확히 한 번씩 방문합니다.
  • 공간 복잡도: O(n) — 최악의 경우 큐에 트리의 한 레벨 전체(최대 n/2개 노드)가 저장될 수 있습니다.