Skip to content

Commit 481aff7

Browse files
gogouravrpre-commit-ci[bot]cclauss
authored
Add Mirror a Binary Tree solution (#9534)
* Add `Invert a Binary Tree` solution * Add type * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add `doctest` * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add `test` to `get_tree_inorder` * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add `test` changes * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix lint errors * Fix precommit errors * Update and rename invert_binary_tree.py to mirror_binary_tree.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <[email protected]>
1 parent 6971af2 commit 481aff7

File tree

1 file changed

+153
-0
lines changed

1 file changed

+153
-0
lines changed

Diff for: data_structures/binary_tree/mirror_binary_tree.py

+153
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
"""
2+
Given the root of a binary tree, mirror the tree, and return its root.
3+
4+
Leetcode problem reference: https://leetcode.com/problems/mirror-binary-tree/
5+
"""
6+
from __future__ import annotations
7+
8+
from collections.abc import Iterator
9+
from dataclasses import dataclass
10+
11+
12+
@dataclass
13+
class Node:
14+
"""
15+
A Node has value variable and pointers to Nodes to its left and right.
16+
"""
17+
18+
value: int
19+
left: Node | None = None
20+
right: Node | None = None
21+
22+
def __iter__(self) -> Iterator[int]:
23+
if self.left:
24+
yield from self.left
25+
yield self.value
26+
if self.right:
27+
yield from self.right
28+
29+
def __len__(self) -> int:
30+
return sum(1 for _ in self)
31+
32+
def mirror(self) -> Node:
33+
"""
34+
Mirror the binary tree rooted at this node by swapping left and right children.
35+
36+
>>> tree = Node(0)
37+
>>> list(tree)
38+
[0]
39+
>>> list(tree.mirror())
40+
[0]
41+
>>> tree = Node(1, Node(0), Node(3, Node(2), Node(4, None, Node(5))))
42+
>>> tuple(tree)
43+
(0, 1, 2, 3, 4, 5)
44+
>>> tuple(tree.mirror())
45+
(5, 4, 3, 2, 1, 0)
46+
"""
47+
self.left, self.right = self.right, self.left
48+
if self.left:
49+
self.left.mirror()
50+
if self.right:
51+
self.right.mirror()
52+
return self
53+
54+
55+
def make_tree_seven() -> Node:
56+
r"""
57+
Return a binary tree with 7 nodes that looks like this:
58+
1
59+
/ \
60+
2 3
61+
/ \ / \
62+
4 5 6 7
63+
64+
>>> tree_seven = make_tree_seven()
65+
>>> len(tree_seven)
66+
7
67+
>>> list(tree_seven)
68+
[4, 2, 5, 1, 6, 3, 7]
69+
"""
70+
tree = Node(1)
71+
tree.left = Node(2)
72+
tree.right = Node(3)
73+
tree.left.left = Node(4)
74+
tree.left.right = Node(5)
75+
tree.right.left = Node(6)
76+
tree.right.right = Node(7)
77+
return tree
78+
79+
80+
def make_tree_nine() -> Node:
81+
r"""
82+
Return a binary tree with 9 nodes that looks like this:
83+
1
84+
/ \
85+
2 3
86+
/ \ \
87+
4 5 6
88+
/ \ \
89+
7 8 9
90+
91+
>>> tree_nine = make_tree_nine()
92+
>>> len(tree_nine)
93+
9
94+
>>> list(tree_nine)
95+
[7, 4, 8, 2, 5, 9, 1, 3, 6]
96+
"""
97+
tree = Node(1)
98+
tree.left = Node(2)
99+
tree.right = Node(3)
100+
tree.left.left = Node(4)
101+
tree.left.right = Node(5)
102+
tree.right.right = Node(6)
103+
tree.left.left.left = Node(7)
104+
tree.left.left.right = Node(8)
105+
tree.left.right.right = Node(9)
106+
return tree
107+
108+
109+
def main() -> None:
110+
r"""
111+
Mirror binary trees with the given root and returns the root
112+
113+
>>> tree = make_tree_nine()
114+
>>> tuple(tree)
115+
(7, 4, 8, 2, 5, 9, 1, 3, 6)
116+
>>> tuple(tree.mirror())
117+
(6, 3, 1, 9, 5, 2, 8, 4, 7)
118+
119+
nine_tree:
120+
1
121+
/ \
122+
2 3
123+
/ \ \
124+
4 5 6
125+
/ \ \
126+
7 8 9
127+
128+
The mirrored tree looks like this:
129+
1
130+
/ \
131+
3 2
132+
/ / \
133+
6 5 4
134+
/ / \
135+
9 8 7
136+
"""
137+
trees = {"zero": Node(0), "seven": make_tree_seven(), "nine": make_tree_nine()}
138+
for name, tree in trees.items():
139+
print(f" The {name} tree: {tuple(tree)}")
140+
# (0,)
141+
# (4, 2, 5, 1, 6, 3, 7)
142+
# (7, 4, 8, 2, 5, 9, 1, 3, 6)
143+
print(f"Mirror of {name} tree: {tuple(tree.mirror())}")
144+
# (0,)
145+
# (7, 3, 6, 1, 5, 2, 4)
146+
# (6, 3, 1, 9, 5, 2, 8, 4, 7)
147+
148+
149+
if __name__ == "__main__":
150+
import doctest
151+
152+
doctest.testmod()
153+
main()

0 commit comments

Comments
 (0)