반응형
목차
문제
Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).
Example 1:
Input: root = [1,2,2,3,4,4,3]
Output: true
Example 2:
Input: root = [1,2,2,null,3,null,3]
Output: false
Constraints:
- The number of nodes in the tree is in the range [1, 1000].
- -100 <= Node.val <= 100
Follow up: Could you solve it both recursively and iteratively?
풀이
재귀 사용한 풀이
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
boolean answer = true;
public boolean isSymmetric(TreeNode root) {
/**
아이디어
1. 재귀로 왼쪽 자식노드의 (왼쪽 자식노드 , 오른쪽 자식노드) / 오른쪽 자식노드의 (오른쪽 자식노드 , 왼쪽 자식노드) 가 같은지 비교
2. 2 depth까지는 좌우 동일해야하고 3depth부터 위 로직으로 체크 필요
*/
//1depth만 존재하는 경우
if(root.left == null && root.right == null){
return true;
}
//2depth 체크
if((root.left == null || root.right == null) || (root.left.val != root.right.val)){
return false;
}
//3depth부터 재귀로 체크
recCheckSymmetric(root.left, root.right);
return answer;
}
public void recCheckSymmetric(TreeNode leftTree, TreeNode rightTree){
if(leftTree != null && rightTree != null){
//leftTree와 rightTree가 모두 null이 아닌 경우 체크
if(leftTree.val != rightTree.val){
answer = false;
}
recCheckSymmetric(leftTree.left, rightTree.right);
recCheckSymmetric(leftTree.right, rightTree.left);
}else if (leftTree == null && rightTree == null){
//leftTree와 rightTree가 null인 경우 동일하다고 간주
}else{
//leftTree와 rightTree 중 하나가 null인 경우 다르다고 간주
answer = false;
}
}
}
스택 사용한 풀이
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
/**
아이디어
1. 스택 사용
2. 스택에 부분 트리를 넣어 지속적으로 확인
*/
if(root == null){
return true;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root.left);
stack.push(root.right);
while(!stack.empty()) {
TreeNode right = stack.pop();
TreeNode left = stack.pop();
if (left == null && right == null){
continue;
}
else if (left == null || right == null || right.val != left.val) {
return false;
}
stack.push(left.left);
stack.push(right.right);
stack.push(left.right);
stack.push(right.left);
}
return true;
}
}
반응형
'코딩테스트 > 알고리즘 문제풀이' 카테고리의 다른 글
[JAVA] 모의고사 (0) | 2023.02.09 |
---|---|
[JAVA] 최소직사각형 (0) | 2023.01.19 |
[JAVA] 100. Same Tree (0) | 2022.12.29 |
[JAVA] 94. Binary Tree Inorder Traversal (0) | 2022.12.28 |
[JAVA] 디스크 컨트롤러 (0) | 2022.12.26 |
댓글