Zero to Hero
article thumbnail
Published 2021. 5. 2. 00:37
101. Symmetric Tree Algorithm
 

Symmetric Tree - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

1. in-order 접근(실패)

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        trace = []

        def dfs(cur):
            if not cur:
                trace.append(None)
            else:
                if not (not cur.left and not cur.right):
                    dfs(cur.left)
                trace.append(cur.val)
                if not (not cur.left and not cur.right):
                    dfs(cur.right)

        dfs(root)
        print(trace)
        if trace[:len(trace) // 2][::-1] == trace[len(trace) // 2 + 1:]:
            return True
        return False

아무런 근거 없이 테스트 케이스를 그래프로 보다가 왼쪽, 오른쪽 subtree를 각각 in-order로 탐색하고 탐색 경로를 절반으로 나누어서 뒤집은 결과가 같으면 대칭이어서 그렇게 해봤지만 실패...

 

 

2. DFS using Stack

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        stack = [(root.left, root.right)]
        while stack:
            cur_left, cur_right = stack.pop()
            if not cur_left and not cur_right:
                continue
            if not cur_left or not cur_right:
                return False
            if cur_left.val == cur_right.val:
                stack.append((cur_left.left, cur_right.right))
                stack.append((cur_left.right, cur_right.left))
            else:
                return False
        return True

2. DFS using Recursion

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        return self.check(root.left, root.right)

    def check(self, left: TreeNode, right: TreeNode):
        if not left and not right:
            return True
        if not left or not right:
            return False

        if left.val == right.val:
            out_pair = self.check(left.left, right.right)
            in_pair = self.check(left.right, right.left)
            return out_pair and in_pair
        return False

 

3. BFS using Queue

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        if not root:
            return True
        queue = deque([(root.left, root.right)])
        while queue:
            cur_left, cur_right = queue.popleft()
            if not cur_left and not cur_right:
                continue
            if not cur_left or not cur_right:
                return False
            if cur_left.val == cur_right.val:
                queue.append((cur_left.left, cur_right.right))
                queue.append((cur_left.right, cur_right.left))
            else:
                return False
        return True

 

leetcode는 어차피 정해라고 부를 수 있는 답이 굉장히 깔끔하다는 것을 알고 있어서 그런지 자꾸 코드에 손이 안 간다. 예쁘게 풀려다가 아예 손도 못 대고 시간만 지나가는 느낌이 없지 않아 있어서 좀 답답하다.

'Algorithm' 카테고리의 다른 글

141. Linked List Cycle  (0) 2021.05.03
53. Maximum Subarray  (0) 2021.05.02
155. Min Stack  (0) 2021.04.30
160. Intersection of Two Linked Lists  (0) 2021.04.30
70. Climbing Stairs  (0) 2021.04.29
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!