Skip to content

Commit 7751161

Browse files
Add Morris Traversal (in-order & pre-order) with test cases
1 parent e2a78d4 commit 7751161

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

searches/binary_tree_traversal.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
261331
def 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

Comments
 (0)