문제 링크
문제 요구 조건
두개의 이진 트리가 동일한지 확인하는 문제에요.
나의 문제 풀이
재귀적으로 접근하는 방식을 써야겠다고 생각했지만, 풀지는 못했어요. ㅠ 바로 풀이로 가실게요.
정답 문제 풀이
이 문제를 풀기 위해서는 재귀적 방법으로 푸는 것이 추천되어요. 일단 둘다 null인 경우 / 하나만 null인 경우 / 노드값이 다른 경우를 먼저 커버한 다음에 재귀적 함수를 사용하면 되어요.
정답 풀이
/** * 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) * } */ /** * @param {TreeNode} p * @param {TreeNode} q * @return {boolean} */ var isSameTree = function(p, q) { // 1. 두 노드가 모두 null이면 동일 if (!p && !q) { return true; } // 2. 둘 중 하나만 null이거나, 두 노드의 값이 다르면 동일하지 않음 if (!p || !q || p.val !== q.val) { return false; } // 3. 왼쪽 서브트리와 오른쪽 서브트리가 모두 동일한지 재귀적으로 확인 return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); };
코드를 설명해 볼게요.
isSameTree(p, q)
함수는 두 개의 노드를 인자로 받아요.
- 첫 번재
if
문
p
와 q
가 모두 null
인 경우를 체크합니다. 이는 두 트리의 해당 위치가 모두 비어있으면 동일하다고 판단하여 true
를 반환하게 할거에요 - 두 번째
if
문 !p
또는!q
p.val !== q.val
- 위 조건중 하나라도 만족하면
false
를 반환하게 할 거에요
여기서는 세가지의 경우를 한 번에 처리할거에요.
p
와 q
중 하나만 null
인 경우 (위의 첫 번쨰 if
문에서 둘 다 null 인 경우는 이미 걸러졌겠죠?)두 노드가 존재하더라도 그 값이 다른 경우를 검증해요
- 마지막
return
문
두 노드가 모두 존재하고 값도 같은 경우,
p
의 왼쪽 자식과 q
의 왼쪽 자식을 비교하는 재귀호출과 오른쪽 자식들을 비교하는 재귀호출의 결과를 AND
연산으로 결합해요. 그리고 두 서브트리가 모두 동일해야만 전체 트리가 동일하다고 판단을 할 수 있어요. 느낀점
이진 트리문제는 그렇게 어렵지 않게 느껴지면서도 머리속에 떠오르지 않아 계속 해메게 되는 문제인거 같아요. 일단 제가 이때까지 생각해보지 못한 새로운 사고방식을 적용한다는 느낌이 들어서, 못 풀면서도 이해하는 과정에서 실력을 키울 수 있다고 생각해요.
다들 오늘도 화이팅!!