From 775116130c2836ae9ff4841222c671596b2c2908 Mon Sep 17 00:00:00 2001 From: richierichijk Date: Tue, 21 Oct 2025 21:08:33 +0530 Subject: [PATCH] Add Morris Traversal (in-order & pre-order) with test cases --- searches/binary_tree_traversal.py | 77 +++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/searches/binary_tree_traversal.py b/searches/binary_tree_traversal.py index 47af57f7f94d..66a559ab697a 100644 --- a/searches/binary_tree_traversal.py +++ b/searches/binary_tree_traversal.py @@ -258,6 +258,76 @@ def post_order_iter(node: TreeNode) -> None: print(stack2.pop().data, end=",") +# Morris Traversal implementations +def morris_in_order(node: TreeNode) -> None: + """ + Morris In-Order Traversal without recursion or stack + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> morris_in_order(root) + 4,2,5,1,6,3,7, + """ + current = node + while current: + if not current.left: + print(current.data, end=",") + current = current.right + else: + pre = current.left + while pre.right and pre.right != current: + pre = pre.right + if not pre.right: + pre.right = current + current = current.left + else: + pre.right = None + print(current.data, end=",") + current = current.right + + +def morris_pre_order(node: TreeNode) -> None: + """ + Morris Pre-Order Traversal without recursion or stack + >>> root = TreeNode(1) + >>> tree_node2 = TreeNode(2) + >>> tree_node3 = TreeNode(3) + >>> tree_node4 = TreeNode(4) + >>> tree_node5 = TreeNode(5) + >>> tree_node6 = TreeNode(6) + >>> tree_node7 = TreeNode(7) + >>> root.left, root.right = tree_node2, tree_node3 + >>> tree_node2.left, tree_node2.right = tree_node4 , tree_node5 + >>> tree_node3.left, tree_node3.right = tree_node6 , tree_node7 + >>> morris_pre_order(root) + 1,2,4,5,3,6,7, + """ + current = node + while current: + if not current.left: + print(current.data, end=",") + current = current.right + else: + pre = current.left + while pre.right and pre.right != current: + pre = pre.right + if not pre.right: + print(current.data, end=",") + pre.right = current + current = current.left + else: + pre.right = None + current = current.right + + + def prompt(s: str = "", width=50, char="*") -> str: if not s: return "\n" + width * char @@ -303,3 +373,10 @@ def prompt(s: str = "", width=50, char="*") -> str: print(prompt("Post Order Traversal - Iteration Version")) post_order_iter(node) print(prompt()) + + morris_in_order(node) + print(prompt() + "\n") + + print(prompt("Morris Pre-Order Traversal")) + morris_pre_order(node) + print(prompt())