Table of Contents
이진 트리 반전
난이도 | ★
리트코드 226
문제
Example 1:
Input: root = [4,2,7,1,3,6,9]
Output: [4,7,2,9,6,3,1]
Example 2:
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 한다
[전체 탐색 순서]
도식화
그림에서는 루트 노드인 4 에서 시작하되, 오른쪽부터 재귀 탐색을 진행한다.
- 앞에서 보인 전체 코드에서, self.invertTree 의 파라미터로 root.right 를 먼저 넘겼기 때문
1]self.invertTree(root.right)
의 잎노드
1) & 2) 3)
- return root를 하는 이유는 root 노드가 형제노드를 갖고있으면 swap하기 위해
2]self.invertTree(root.left)
의 잎노드
1) & 2) 3)
- return root를 하는 이유는 root 노드가 형제노드를 갖고있으면 swap하기 위해
부모노드 swap
[2],[3] / [5],[6]번이 처리되었으니 처리되지 않은 [1],[2]번을 처리해야 한다