• Home
  • About
    • Yerim Oh photo

      Yerim Oh

      Happy and worthwhile day by day :)

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Github
    • Youtube
  • Posts
    • All Posts
    • All Tags
  • Projects

[1003] (파이썬) leet code_226. Invert Binary Tree

29 Jan 2020

Reading time ~1 minute

Table of Contents
  • 이진 트리 반전
    • 문제
    • 문제 풀기 전 알고 갈 개념
  • [풀이 1] 파이썬 적합 방식
    • 풀이 과정
    • 도식화
      • 1]self.invertTree(root.right)의 잎노드
      • 2]self.invertTree(root.left)의 잎노드
      • 부모노드 swap

이진 트리 반전

난이도 | ★
리트코드 226

문제

Example 1: image

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

Example 2: image

Input: root = [2,1,3]
Output: [2,3,1]

Example 3:

Input: root = []
Output: []
Constraints:

The number of nodes in the tree is in the range [0, 100].
-100 <= Node.val <= 100

[전제]

# 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: TreeNode) -> TreeNode:

문제 풀기 전 알고 갈 개념


[풀이 1] 파이썬 적합 방식

def invertTree(self, root: TreeNode) -> TreeNode:
  if root:
    root.left, root.right = self.invertTree(root.right), self.invertTree(root.left) 
    return root 
  return None

풀이 과정

필기 편의상 invertTree 를 iT라고 쓰겠다.

  • 먼저 a,b = b,a 는 a와 b의 두 값을 바꾸는 것이다
  • 그런데 이 문장이 시작되기 전에 self.invertTree(root.right), self.invertTree(root.left)가 각각 실행되어 자식이 모두 잎노드 일 떄 까지 inverse 되지 않는다.
  • 또한 마지막 노드를 탐색 할 떈 자식노드가 없어 if문이 실행되지 않으므로 return None이 실행되어 끝 노드에 각각 None이 붙는다

그러므로 전체 과정은,
1) self.invertTree(root.right), self.invertTree(root.left)를 통해 자식이 모두 잎노드 일 떄 까지 탐색 2) 자식노드에 none return
3) 더이상 재귀실현이 불하하므로 root.left, root.right = self.invertTree(root.right), self.invertTree(root.left) 실행하여 자식 노드 inverse

  • 즉 밑의 그림과 같이 오른쪽 sub tree부터 탐색하고 자식노드가 잎이므로 swap 한다

[전체 탐색 순서] image

도식화

그림에서는 루트 노드인 4 에서 시작하되, 오른쪽부터 재귀 탐색을 진행한다.

  • 앞에서 보인 전체 코드에서, self.invertTree 의 파라미터로 root.right 를 먼저 넘겼기 때문

1]self.invertTree(root.right)의 잎노드

1) & 2) image 3)

  • return root를 하는 이유는 root 노드가 형제노드를 갖고있으면 swap하기 위해 image

2]self.invertTree(root.left)의 잎노드

1) & 2) image 3)

  • return root를 하는 이유는 root 노드가 형제노드를 갖고있으면 swap하기 위해 image

부모노드 swap

[2],[3] / [5],[6]번이 처리되었으니 처리되지 않은 [1],[2]번을 처리해야 한다 image



Coding test Share Tweet +1