문제 링크
문제 요구 조건
주어진 이진 트리가 대칭인지 확인하는 로직이에요.
나의 문제 풀이
이번 문제도 풀지 못했네요 ㅠ 바로 풀이로 가실게요!
정답 문제 풀이
이번 문제는 재귀적방식과 반복적 방식으로 푸는 방법이 있어요. 이 블로그에서는 재귀적 방식으로 푸는 방법을 다뤄보도록 할게요.
/**
* 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분간의 유효시간을 가지고 풀어보려 했지만, 계속 실패하는 요즘이네요. 정답을 보고 나면 그렇게 어렵게 안 느껴지는데 계속 못푸는 이유는 재귀적 함수의 개념과 노드에 대한 이해가 머릿속에 아직 자리잡지 않았기 때문이라 생각해요. 계속 노력해볼거에요!
![[LeetCode] Symmetric Tree](/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fattachment%253A24003284-054c-4114-a2cc-30c06200a54b%253A16.png%3Ftable%3Dblock%26id%3D2729c76c-6cb4-8051-b57f-ed31d6ff9d93%26spaceId%3Db4216657-966f-4c29-ae8c-42f6c4adb66d&w=3840&q=75)
