코딩테스트/알고리즘 문제풀이

[JAVA] 101. Symmetric Tree

지과쌤 2022. 12. 29.
반응형

목차

    문제

    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

    댓글

    💲 추천 글