Leetcode # 226. Invert Binary Tree
- 2022.12.12
- Binary Tree LeetCode
https://leetcode.com/problems/invert-binary-tree/
Solution
示例
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
A
![]()
![]()
![]()
![]()
![]()
B![]()
![]()
![]()
![]()
![]()
![]()
C
![]()
![]()
![]()
D![]()
![]()
E ![]()
F![]()
![]()
G
![]()
![]()
H
I
J
K
L
M
N
O
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
A
![]()
![]()
![]()
![]()
![]()
C![]()
![]()
![]()
![]()
![]()
![]()
B
➡︎![]()
F![]()
![]()
G![]()
![]()
D![]()
![]()
E
![]()
![]()
L
M
N
O
H
I
J
K
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
A
![]()
![]()
![]()
![]()
![]()
C![]()
![]()
![]()
![]()
![]()
![]()
B
➡︎![]()
G![]()
![]()
F![]()
![]()
E![]()
![]()
D
![]()
![]()
N
O
L
M
J
K
H
I
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
A
![]()
![]()
![]()
![]()
![]()
C![]()
![]()
![]()
![]()
![]()
![]()
B
➡︎![]()
G![]()
![]()
F![]()
![]()
E![]()
![]()
D
![]()
![]()
O
N
M
L
K
J
I
H
證明:Mathematical Induction 數學歸納法
Swap all left child and right child of every node from root level to last level, you can get inverted binary tree.
\begin{align}
& N_{i, j} \text{ is } j^\text{th} \text{ node in level } i, i \text{start from 0}, j \in [0, 2^i) \\
& N_{i, j’} := N_{i, (2^i – 1 – j)} \text{ is the mirrored } N_i, j \\
\\
& \text{Base Case: } \\
& \quad \text{If you swap the left child and the right child of root, }\\
& \quad \text{Level_1 was inverted. } \\
& \quad \text{The statement holds for the first node root, you inverted from root to } \text{level}_1 \\
\\
& \text{Induction step: } \\
& \quad \text{Assume the tree form root to } \text{level}_i \text{ are inverted. } \\
& \quad \text{The origin position of } P_{i, j} \text{ is }j \text{. } \\
& \quad \text{For now, the new position of } P_{i, j} \text{‘s parent } P_{(i – 1), (j \ // \ 2)} \text{ is } (2^{i-1} – 1 – (j \ // \ 2)) \text{.} \\
& \quad \text{The current position of } P_{i, j} \text{ is } \\
& \qquad 2[2^{i-1} – 1 – (j \ // \ 2)] +
\begin{cases}
0 \text{, if } P_{i, j} \text{ was right child. } \\
1 \text{, if } P_{i, j} \text{ was left child. }
\end{cases}\\
& \qquad = \left[2^i – 2 – \left(j –
\begin{cases}
1 \text{, if } P_{i, j} \text{ was right child. } \\
0 \text{, if } P_{i, j} \text{ was left child. }
\end{cases}
\right) \right] + \begin{cases}
0 \text{, if } P_{i, j} \text{ was right child. } \\
1 \text{, if } P_{i, j} \text{ was left child. }
\end{cases}\\
& \qquad = (2^i – 2 – j + 1) = (2^i – 1 – j) = N_{i, j’} \\
& \quad \text{We showed for every } i \text{, if the statement holds for level } i \text{, then it holds for level }(i + 1) \\
\end{align}
Complexity and Codes
Time Complexity: O(len(tree))
Space Complexity: O(len(tree))
(The input and output generally do not count towards the space complexity.)
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
queue = collections.deque([root]) if root else None
while queue:
cur = queue.pop()
if cur.left: queue.append(cur.left)
if cur.right: queue.append(cur.right)
cur.left, cur.right = cur.right, cur.left
return root
Last Updated on 2023/08/16 by A1go