반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[LeetCode/Python] 226.이진 트리 반전(Invert Binary Tree) 본문

Algorithm Study/leetcode

[LeetCode/Python] 226.이진 트리 반전(Invert Binary Tree)

오패산개구리 2021. 8. 7. 19:36
728x90
반응형

 

 

Given the root of a binary tree, invert the tree, and return its root.

 

 

 

Example

 

Input: root = [4,2,7,1,3,6,9]

 

Output: [4,7,2,9,6,3,1]

 

 

 

1. 파이썬다운 방식

 

 

1
2
3
4
5
6
7
8
9
10
11
12
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root:
            root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
            return root
        return None
cs

 

해설

 

재귀 구조로 쉽게 해결할 수 있다.

 

재귀 진행 순서

 

코드 상으로 self.invertTree(root.right)가 먼저 시작하므로

 

최종 아랫단에서는 "9"에서 시작한다.

 

참고로 마지막 return None은 생략이 가능하다.

 

파이썬에서는 아무것도 리턴하지 않으면 자연스럽게 None을 할당하기 때문이다.

 

 

 

2. 반복 구조로 BFS

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        queue = collections.deque([root])
        
        while queue:
            node = queue.popleft()
            # 부모 노드로부터 하향식 스왑
            if node:
                node.left, node.right = node.right, node.left
 
                queue.append(node.left)
                queue.append(node.right)
                
        return root
cs

 

해설

 

흐름

 

위에서 아래로 내려가면서 스왑하는 코드이다.

 

(너비 우선 탐색)

 

deque를 사용하였고 root의 경우 값을 참조하였으므로

 

최종적으로 root를 리턴하면 된다.

 

 

 

 

3. 반복 구조로 DFS

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        stack = collections.deque([root])
        
        while stack:
            node = stack.pop()
            # 부모 노드로부터 하향식 스왑
            if node:
                node.left, node.right = node.right, node.left
 
                stack.append(node.left)
                stack.append(node.right)
                
        return root
cs

 

해설

 

흐름

 

2번 코드에서 바뀐 거라곤 popleft와 pop의 차이 정도?

 

하지만 진행 순서는 확연히 다르다.

 

이 코드는 깊이 우선 탐색이 된다.

 

 

 

 

 

4. 반복 구조로 DFS 후위 순회

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        stack = collections.deque([root])
        
        while stack:
            node = stack.pop()
 
            if node:
                stack.append(node.left)
                stack.append(node.right)
 
                node.left, node.right = node.right, node.left # 후위 순회
                
        return root
cs

 

해설

 

3번 코드에서 stack에 추가해주는 단계를 먼저 진행했을 뿐이다.

 

이렇게 바꾸면 전위 순회였던 3번 코드에서 후위 순회로 변경되는 것인데

 

사실 아직 부족해서 이게 왜 후위 순회인지 모르겠다.

 

나중에 알게되면 추가하겠다.

 

댓글로 알려주시면 ㄳ

 

 

※ 전위 순회

 

뿌리를 먼저 방문하는 방식

 

 

※ 후위 순회

 

하위 트리를 모두 방문 후 뿌리를 방문하는 방식

728x90
반응형