55
66
77@dataclass
8- class Node :
8+ class BNode :
99 key : int
10- left : Node | None = None
11- right : Node | None = None
10+ left : BNode | None = None
11+ right : BNode | None = None
1212
1313
1414# O(n)
1515def dfs_all (nodes : list [tuple [int , int , int ]]) -> tuple [list [int ], list [int ], list [int ]]:
1616 """
17- Perform DFS on a tree represented by a list of tuples (key, left_index, right_index).
18- Returns three lists: inorder, preorder, and postorder traversals.
17+ Обход дерева в глубину (DFS) с использованием рекурсии. Возвращает три списка:
18+ - inorder (симметричный) обход
19+ - preorder (прямой) обход
20+ - postorder (обратный) обход
1921 """
2022 root = build_tree (nodes )
2123 return (
22- dfs_inorder (root ),
23- dfs_preorder (root ),
24- dfs_postorder (root ),
24+ dfs (root , "inorder" ),
25+ dfs (root , "preorder" ),
26+ dfs (root , "postorder" ),
2527 )
2628
2729
2830# O(n)
29- def dfs (root : Node , style : Literal ["inorder" , "preorder" , "postorder" ] = "inorder" ) -> list [int ]:
31+ def dfs (root : BNode , style : Literal ["inorder" , "preorder" , "postorder" ] = "inorder" ) -> list [int ]:
3032 """
31- Perform DFS on a tree and return the traversal in the specified style .
33+ Обход дерева в глубину (DFS) с использованием рекурсии .
3234 """
3335 match style :
3436 case "inorder" :
@@ -42,9 +44,9 @@ def dfs(root: Node, style: Literal["inorder", "preorder", "postorder"] = "inorde
4244
4345
4446# O(n)
45- def dfs_inorder (node : Node | None ) -> list [int ]:
47+ def dfs_inorder (node : BNode | None ) -> list [int ]:
4648 """
47- Perform an inorder DFS traversal of the tree .
49+ Обход дерева в глубину ( DFS) в симметричном порядке .
4850 """
4951 if node is None :
5052 return []
@@ -53,9 +55,9 @@ def dfs_inorder(node: Node | None) -> list[int]:
5355
5456
5557# O(n)
56- def dfs_preorder (node : Node | None ) -> list [int ]:
58+ def dfs_preorder (node : BNode | None ) -> list [int ]:
5759 """
58- Perform a preorder DFS traversal of the tree .
60+ Обход дерева в глубину ( DFS) в прямом порядке .
5961 """
6062 if node is None :
6163 return []
@@ -64,28 +66,26 @@ def dfs_preorder(node: Node | None) -> list[int]:
6466
6567
6668# O(n)
67- def dfs_postorder (node : Node | None ) -> list [int ]:
69+ def dfs_postorder (node : BNode | None ) -> list [int ]:
6870 """
69- Perform a postorder DFS traversal of the tree .
71+ Обход дерева в глубину ( DFS) в обратном порядке .
7072 """
7173 if node is None :
7274 return []
7375 # dfs_postorder(node.left) + dfs_postorder(node.right) + [node.key]
74- return dfs_postorder (node .left ) + dfs_postorder (node .right ) + [ node .key ]
76+ return [ * dfs_postorder (node .left ), * dfs_postorder (node .right ), node .key ]
7577
7678
7779# O(n)
78- def build_tree (nodes : list [tuple [int , int , int ]]) -> Node :
80+ def build_tree (nodes : list [tuple [int , int , int ]]) -> BNode :
7981 """
80- Build a binary tree from a list of tuples where each tuple contains:
81- - key: the value of the node
82- - left_index: index of the left child (-1 if no left child)
83- - right_index: index of the right child (-1 if no right child)
82+ Строит бинарное дерево из списка кортежей (ключ, индекс левого ребенка, индекс правого ребенка).
83+ -1 используется для обозначения отсутствующего ребенка.
8484 """
8585 n = len (nodes )
8686 if n <= 0 :
8787 raise ValueError ("Input list must contain at least one element." )
88- tree = [Node (0 ) for _ in range (n )]
88+ tree = [BNode (0 ) for _ in range (n )]
8989 for i in range (n ):
9090 key , left , right = nodes [i ]
9191 tree [i ].key = key
@@ -94,80 +94,3 @@ def build_tree(nodes: list[tuple[int, int, int]]) -> Node:
9494 if right >= 0 :
9595 tree [i ].right = tree [right ]
9696 return tree [0 ]
97-
98-
99- # Advanced: Iterative DFS implementation
100-
101-
102- # O(n)
103- def dfs_all_iterative (nodes : list [tuple [int , int , int ]]) -> tuple [list [int ], list [int ], list [int ]]:
104- """
105- Perform an iterative DFS on a tree represented by a list of tuples (key, left_index, right_index).
106- Returns three lists: inorder, preorder, and postorder traversals.
107- """
108- root = build_tree (nodes )
109- return (
110- dfs_inorder_iterative (root ),
111- dfs_preorder_iterative (root ),
112- dfs_postorder_iterative (root ),
113- )
114-
115-
116- # O(n)
117- def dfs_preorder_iterative (node : Node ) -> list [int ]:
118- """
119- Perform an iterative preorder DFS traversal of the tree.
120- """
121- st = [node ]
122- result = []
123- while st :
124- node = st .pop ()
125- result .append (node .key )
126- # Push right first so that left is processed first
127- if node .right is not None :
128- st .append (node .right )
129- if node .left is not None :
130- st .append (node .left )
131- return result
132-
133-
134- # O(n)
135- def dfs_postorder_iterative (node : Node ) -> list [int ]:
136- """
137- Perform an iterative postorder DFS traversal of the tree.
138- """
139- st = [node ]
140- result = []
141- while st :
142- node = st .pop ()
143- result .append (node .key )
144- # Push left first so that right is processed first
145- if node .left is not None :
146- st .append (node .left )
147- if node .right is not None :
148- st .append (node .right )
149- # Reverse the result to get postorder
150- result .reverse ()
151- return result
152-
153-
154- # O(n)
155- def dfs_inorder_iterative (node : Node ) -> list [int ]:
156- """
157- Perform an iterative inorder DFS traversal of the tree.
158- """
159- st : list [Node ] = []
160- result : list [int ] = []
161- curr : Node | None = node
162- while st or curr is not None :
163- # Go to the leftmost node
164- if curr is not None :
165- st .append (curr )
166- curr = curr .left
167- # Process the node
168- else :
169- # Pop from stack and visit the node
170- curr = st .pop ()
171- result .append (curr .key )
172- curr = curr .right
173- return result
0 commit comments