Problem

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

https://leetcode.com/problems/invert-binary-tree/

Example 1:

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

Example 2:

Input: root = [4,2,7,1,3,6,9]
Output: [4,7,2,9,6,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

Test Cases

1
2
3
4
5
6
7
8
# 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]:
solution_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pytest

import sys
sys.path.insert(0, '..')
from _utils.binary_tree import build_tree, print_tree
from solution import Solution

null = None


@pytest.mark.parametrize('root, expected', [
([4,2,7,1,3,6,9], [4,7,2,9,6,3,1]),
([2,1,3], [2,3,1]),
([], []),
])
class Test:
def test_solution(self, root, expected):
sol = Solution()
result = sol.invertTree(build_tree(root))
assert print_tree(result) == expected

Thoughts

按任何顺序遍历二叉树,前序(pre-order,NLR),对于当前节点,交换左右子节点即可。

Code

solution.py
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
from typing import Optional

import sys
sys.path.insert(0, '..')
from _utils.binary_tree import TreeNode


# 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]:
backup = root
stack = []
while root or stack:
if root:
stack.append(root)
root.left, root.right = root.right, root.left
root = root.left # Original right child.
else:
root = stack.pop().right # Original left child.

return backup