Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
이진 트리가 주어지면 그것이 자신의 거울인지 (즉, 중심을 기준으로 대칭인지) 확인하십시오.
예를 들어 이진 트리 [1,2,2,3,4,4,3]
은 대칭입니다.
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
그러나 다음 [1,2,2, null, 3, null, 3]
은 아닙니다 :
1
/ \
2 2
\ \
3 3
Note : Bonus points if you could solve it both recursively and iteratively.
재귀적으로 반복적으로 해결할 수 있다면 보너스 포인트.
재귀호출(recursive call) :
재귀호출이란 어떤 함수에서 자신을 다시 호출하여 작업을 수행하는 방식의 함수를 의미합니다.
재귀함수를 작성할 때는 함수내에서 다시 자신을 호출한 후 그 함수가 끝날 때 까지 함수 호출 이후의 명령문이 수행되지 않는다는 사실과 종료조건(stop condition)이 꼭 포함 되어야한다는 부분을 인지하고 작성하여야 무한로프를 방지할 수 있습니다.
대칭이 되려면 서브 트리의 왼쪽과 오른쪽 또는 그 반대 오른쪽과 왼쪽이 같은지를 비교해야 합니다.
1
/ \
2(a) 2(b)
/ \ / \
3 4 4 3
루트(1)를 제외하고 2(a)의 왼쪽(3)과 2(b)의 오른쪽(3)이 같고, 2(a)의 오른쪽(4)과 2(b)의 왼쪽(4)이 같아야 합니다.
그리고 이 문제 풀이에서 중요한 것은, 같다면 true를 return 하는 것이 아니고, false를 찾아내서 return하고 끝까지 false가 없다면 true를 return하는 방식으로 대칭을 확인합니다. 이유는 같아서 true를 return 한다면 그 다음은 대칭인지 확인하지 않고 true로 결과를 나타내기 때문일 것입니다.
즉, true를 찾는 과정이 아닌 false를 찾아내는 과정이며, 끝까지 false가 없다면 true(대칭)인 것 입니다.
Answer :
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
return compare(root.left, root.right);
}
public boolean compare(TreeNode left, TreeNode right){
if( left == null && right == null ) return true; //a
if( left == null || right == null ) return false; //b
if( left.val != right.val ) return false; //c
return compare( left.left, right.right ) && compare( left.right, right.left);
}
}
위 문제의 재귀호출 stop condition은 모든 경우의 수에 대해 return하게 함으로써, 무한로프를 방지 합니다.
출처 : 제가 알고리즘 문제에 막 감을 익히고 있는 단계여서 유튜버 승지니어님의 코드를 많이 인용하였습니다. 도움되는 영상이 많이 있으므로 많은 방문 부탁드리겠습니다.
유튜브 승지니어 해당영상