문제 링크
문제 요구 조건
주어진 이진 트리가 대칭인지 확인하는 로직이에요.
나의 문제 풀이
이번 문제도 풀지 못했네요 ㅠ 바로 풀이로 가실게요!
정답 문제 풀이
이번 문제는 재귀적방식과 반복적 방식으로 푸는 방법이 있어요. 이 블로그에서는 재귀적 방식으로 푸는 방법을 다뤄보도록 할게요.
/** * 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)
과 유사하고, 두 개의 노드를 인자로 받는 보조 함수를 사용해요. isSymmetric
함수에서 루트 노드가null
인지 확인해요.null
이면 빈 트리이므로 대칭으로 간주하고true
를 반환해요.
- 루트 노드가
null
이 아니면,isMirror
와 같은 보조 함수를 호출하여 로트의 왼쪽 자식과 오른쪽 자식을 인자로 넘겨주어요.
isMirror
함수는 두 노드가 서로의 거울인지 확인하는 역할을 해요- 두 노드 모두
null
인 경우 - 두 노드 중 하나만
null
인 경우 - 두 노드 모두
null
이 아닌 경우 - 두 노드의 값이 같은지 확인해요
- 왼쪽 노드의 왼쪽 자식과 오른쪽 노드의 오른쪽 자식이 대칭인지 재귀적으로 확인해요
- 왼쪽 노드의 오른쪽 자식과 오른쪽 노드의 왼쪽 자식이 대칭인지 재귀적으로 확인해요
- 이 세 가지 조건이 모두
true
일 때만true
를 반환해요.
대칭이 되니까
true
를 반환하면 되겠죠?비대칭이므로
false
를 반환해요느낀점
30분간의 유효시간을 가지고 풀어보려 했지만, 계속 실패하는 요즘이네요. 정답을 보고 나면 그렇게 어렵게 안 느껴지는데 계속 못푸는 이유는 재귀적 함수의 개념과 노드에 대한 이해가 머릿속에 아직 자리잡지 않았기 때문이라 생각해요. 계속 노력해볼거에요!