forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgyeo-ri.py
More file actions
132 lines (97 loc) ยท 3.45 KB
/
Copy pathgyeo-ri.py
File metadata and controls
132 lines (97 loc) ยท 3.45 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
"""
[๊ฒฐ๊ณผ ์์ฝ]
# ์๋ํ ๋ก์ง ์: 2
1. DFS๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ
- ํ์ฌ ๋
ธ๋์ ์ข์ฐ๋ฅผ ๋ฐ๊พผ ๋ค์ ๋ฐ๋ก ์๋ ๋
ธ๋๋ก ์ด๋
- ํ์ ๋
ธ๋๊ฐ ์๋ ๋
ธ๋๋ฅผ ๋ง๋ ๋๊น์ง ๋ฐ๋ณต๋๊ณ ์ข
๋ฃ๋จ
- ์๊ฐ๋ณต์ก๋๋ O(n)
- ๊ณต๊ฐ๋ณต์ก๋๋ O(n)์ด๊ณ , ํธ๋ฆฌ๊ฐ ๊ท ํ์ด๋ฉด O(logn)๊น์ง ๊ฐ๋ฅ(B-Tree ๊ฐ์ ๊ฒฝ์ฐ)
2. BFS๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ
- ์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋ ๋ชจ๋ O(n)
- DFS์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ํฌ๊ฒ ์์
3. BFS์์ ์ฝ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ํ๊ธฐ
- None์ queue์ ๋ฃ์ง ์๋ ๋ฐฉ๋ฒ
- ํธ๋ฆฌ ํฌ๊ธฐ๊ฐ ์์ฃผ ํฌ์ง ์๋ค๋ฉด ํฐ ํจ๊ณผ๋ ์์
"""
from collections import deque
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 | None) -> TreeNode | None:
if not root:
return root
next_nodes: deque[TreeNode] = deque([root])
while next_nodes:
current = next_nodes.popleft()
if not current:
continue
current.left, current.right = current.right, current.left
if current.left:
next_nodes.append(current.left)
if current.right:
next_nodes.append(current.right)
return root
"""
# DFS๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ
class Solution:
def invertTree(self, root: TreeNode | None) -> TreeNode | None:
def dfs(current: TreeNode | None):
if not current:
return
current.left, current.right = current.right, current.left
dfs(current.right)
dfs(current.left)
dfs(root)
return root
"""
if __name__ == "__main__":
from collections import deque
def _build_tree(values: list[int | None]) -> TreeNode | None:
if not values:
return None
nodes = [TreeNode(value) if value is not None else None for value in values]
child_idx = 1
for node in nodes:
if node is not None:
if child_idx < len(nodes):
node.left = nodes[child_idx]
child_idx += 1
if child_idx < len(nodes):
node.right = nodes[child_idx]
child_idx += 1
return nodes[0]
def _tree_to_list(root: TreeNode | None) -> list[int | None]:
if root is None:
return []
result = []
queue = deque([root])
while queue:
node = queue.popleft()
if node is None:
result.append(None)
continue
result.append(node.val)
queue.append(node.left)
queue.append(node.right)
while result and result[-1] is None:
result.pop()
return result
test_cases = [
([4, 2, 7, 1, 3, 6, 9], [4, 7, 2, 9, 6, 3, 1]),
([2, 1, 3], [2, 3, 1]),
([], []),
([1], [1]),
([1, 2], [1, None, 2]),
]
solution = Solution()
for idx, (inp, expected) in enumerate(test_cases, start=1):
root = _build_tree(inp)
result_root = solution.invertTree(root)
result = _tree_to_list(result_root)
assert (
result == expected
), f"Test Case {idx} Failed: Expected {expected}, Got {result}"
print("All test cases passed.")