@@ -258,6 +258,76 @@ def post_order_iter(node: TreeNode) -> None:
258258 print (stack2 .pop ().data , end = "," )
259259
260260
261+ # Morris Traversal implementations
262+ def morris_in_order (node : TreeNode ) -> None :
263+ """
264+ Morris In-Order Traversal without recursion or stack
265+ >>> root = TreeNode(1)
266+ >>> tree_node2 = TreeNode(2)
267+ >>> tree_node3 = TreeNode(3)
268+ >>> tree_node4 = TreeNode(4)
269+ >>> tree_node5 = TreeNode(5)
270+ >>> tree_node6 = TreeNode(6)
271+ >>> tree_node7 = TreeNode(7)
272+ >>> root.left, root.right = tree_node2, tree_node3
273+ >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
274+ >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
275+ >>> morris_in_order(root)
276+ 4,2,5,1,6,3,7,
277+ """
278+ current = node
279+ while current :
280+ if not current .left :
281+ print (current .data , end = "," )
282+ current = current .right
283+ else :
284+ pre = current .left
285+ while pre .right and pre .right != current :
286+ pre = pre .right
287+ if not pre .right :
288+ pre .right = current
289+ current = current .left
290+ else :
291+ pre .right = None
292+ print (current .data , end = "," )
293+ current = current .right
294+
295+
296+ def morris_pre_order (node : TreeNode ) -> None :
297+ """
298+ Morris Pre-Order Traversal without recursion or stack
299+ >>> root = TreeNode(1)
300+ >>> tree_node2 = TreeNode(2)
301+ >>> tree_node3 = TreeNode(3)
302+ >>> tree_node4 = TreeNode(4)
303+ >>> tree_node5 = TreeNode(5)
304+ >>> tree_node6 = TreeNode(6)
305+ >>> tree_node7 = TreeNode(7)
306+ >>> root.left, root.right = tree_node2, tree_node3
307+ >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5
308+ >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7
309+ >>> morris_pre_order(root)
310+ 1,2,4,5,3,6,7,
311+ """
312+ current = node
313+ while current :
314+ if not current .left :
315+ print (current .data , end = "," )
316+ current = current .right
317+ else :
318+ pre = current .left
319+ while pre .right and pre .right != current :
320+ pre = pre .right
321+ if not pre .right :
322+ print (current .data , end = "," )
323+ pre .right = current
324+ current = current .left
325+ else :
326+ pre .right = None
327+ current = current .right
328+
329+
330+
261331def prompt (s : str = "" , width = 50 , char = "*" ) -> str :
262332 if not s :
263333 return "\n " + width * char
@@ -303,3 +373,10 @@ def prompt(s: str = "", width=50, char="*") -> str:
303373 print (prompt ("Post Order Traversal - Iteration Version" ))
304374 post_order_iter (node )
305375 print (prompt ())
376+
377+ morris_in_order (node )
378+ print (prompt () + "\n " )
379+
380+ print (prompt ("Morris Pre-Order Traversal" ))
381+ morris_pre_order (node )
382+ print (prompt ())
0 commit comments