logoStephen's 기술블로그

포스트 검색

제목, 태그로 포스트를 검색해보세요

[LeetCode] Symmetric Tree

[LeetCode] Symmetric Tree
CodingTest
성훈 김
2025년 9월 18일
목차

문제 링크

문제 요구 조건

주어진 이진 트리가 대칭인지 확인하는 로직이에요.
 

나의 문제 풀이

이번 문제도 풀지 못했네요 ㅠ 바로 풀이로 가실게요!
 

정답 문제 풀이

이번 문제는 재귀적방식과 반복적 방식으로 푸는 방법이 있어요. 이 블로그에서는 재귀적 방식으로 푸는 방법을 다뤄보도록 할게요.
 
TypeScript
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 * this.val = (val===undefined ? 0 : val)
 * this.left = (left===undefined ? null : left)
 * this.right = (right===undefined ? null : right)
 * }
 */
var isSymmetric = function(root) {
    if (!root) {
        return true;
    }

    // 보조 함수를 호출하여 왼쪽 서브트리와 오른쪽 서브트리가 거울인지 확인
    return isMirror(root.left, root.right);
};

function isMirror(node1, node2) {
    // 두 노드 모두 null이면 대칭
    if (!node1 && !node2) {
        return true;
    }

    // 한 노드만 null이거나 두 노드의 값이 다르면 비대칭
    if (!node1 || !node2 || node1.val !== node2.val) {
        return false;
    }

    // 왼쪽 서브트리의 왼쪽과 오른쪽 서브트리의 오른쪽이 대칭이고,
    // 왼쪽 서브트리의 오른쪽과 오른쪽 서브트리의 왼쪽이 대칭인지 재귀적으로 확인
    return isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);
}
 
이 방법은 깊이 우선 탐색(DFS) 과 유사하고, 두 개의 노드를 인자로 받는 보조 함수를 사용해요.
  1. isSymmetric 함수에서 루트 노드가 null 인지 확인해요. null 이면 빈 트리이므로 대칭으로 간주하고 true 를 반환해요.
  1. 루트 노드가 null 이 아니면, isMirror 와 같은 보조 함수를 호출하여 로트의 왼쪽 자식과 오른쪽 자식을 인자로 넘겨주어요.
  1. isMirror 함수는 두 노드가 서로의 거울인지 확인하는 역할을 해요
      • 두 노드 모두 null 인 경우
        • 대칭이 되니까 true 를 반환하면 되겠죠?
      • 두 노드 중 하나만 null인 경우
        • 비대칭이므로 false를 반환해요
      • 두 노드 모두 null이 아닌 경우
        • 두 노드의 값이 같은지 확인해요
        • 왼쪽 노드의 왼쪽 자식과 오른쪽 노드의 오른쪽 자식이 대칭인지 재귀적으로 확인해요
        • 왼쪽 노드의 오른쪽 자식과 오른쪽 노드의 왼쪽 자식이 대칭인지 재귀적으로 확인해요
        • 이 세 가지 조건이 모두 true 일 때만 true를 반환해요.
 

느낀점

30분간의 유효시간을 가지고 풀어보려 했지만, 계속 실패하는 요즘이네요. 정답을 보고 나면 그렇게 어렵게 안 느껴지는데 계속 못푸는 이유는 재귀적 함수의 개념과 노드에 대한 이해가 머릿속에 아직 자리잡지 않았기 때문이라 생각해요. 계속 노력해볼거에요!