📖 Scenario: You have a binary tree representing a family tree. You want to visit each family member in order without using extra memory like a stack or recursion.
🎯 Goal: Build a program that performs Morris inorder traversal on a binary tree and prints the nodes in sorted order without using stack or recursion.
📋 What You'll Learn
Create a binary tree with given nodes
Use Morris traversal technique to traverse inorder without stack
Print the nodes in inorder sequence
💡 Why This Matters
🌍 Real World
Morris traversal is useful when memory is limited and you want to traverse trees efficiently without extra space.
💼 Career
Understanding Morris traversal helps in optimizing tree traversals in embedded systems and performance-critical applications.
Progress0 / 4 steps
1
Create the Binary Tree Node Class and Tree
Create a class called Node with attributes val, left, and right. Then create the root node with value 4, and add left child 2 and right child 5. Also add children 1 and 3 to node 2.
DSA Python
Hint
Define a class with __init__ method and create nodes by assigning left and right children.
2
Initialize Current Pointer for Traversal
Create a variable called current and set it to root. This will be used to traverse the tree.
DSA Python
Hint
Just assign current to root to start traversal.
3
Implement Morris Inorder Traversal Logic
Write a while loop that runs while current is not None. Inside, if current.left is None, print current.val and move current to current.right. Otherwise, find the inorder predecessor of current by moving to the rightmost node in current.left. If predecessor's right is None, set it to current and move current to current.left. Else, set predecessor's right to None, print current.val, and move current to current.right.
DSA Python
Hint
Use a loop to traverse. Use the predecessor's right pointer to create and remove temporary links.
4
Print the Inorder Traversal Result
Run the program to print the inorder traversal of the tree using Morris traversal. The output should be the node values in sorted order separated by spaces.
DSA Python
Hint
The output should show the values in sorted order: 1 2 3 4 5
Practice
(1/5)
1. What is the main advantage of Morris Traversal for inorder tree traversal compared to the traditional recursive or stack-based methods?
easy
A. It uses no extra space for stack or recursion.
B. It is faster than all other traversal methods.
C. It only works on binary search trees.
D. It modifies the tree permanently.
Solution
Step 1: Understand Morris Traversal space usage
Morris Traversal uses threaded binary trees to avoid recursion or stack, so it uses O(1) extra space.
Step 2: Compare with other methods
Traditional inorder traversal uses recursion or stack which requires O(h) space, where h is tree height.
Final Answer:
It uses no extra space for stack or recursion. -> Option A
Quick Check:
Space complexity = O(1) [OK]
Hint: Morris uses threads, no stack or recursion needed [OK]
Common Mistakes:
Thinking Morris is faster in time complexity
Believing it only works on BSTs
Assuming it permanently changes the tree
2. Which of the following code snippets correctly initializes the current node for Morris inorder traversal in Python?
easy
A. current = root
B. current = None
C. current = root.left
D. current = root.right
Solution
Step 1: Identify starting point for traversal
Morris traversal starts from the root node to cover the entire tree.
Step 2: Check initialization options
Setting current = root ensures traversal begins at the tree's root.
Final Answer:
current = root -> Option A
Quick Check:
Start at root node [OK]
Hint: Always start traversal from root node [OK]
Common Mistakes:
Starting from None causes no traversal
Starting from root.left misses root node
Starting from root.right misses left subtree
3. What will be the output of the Morris inorder traversal on the following binary tree?
2
/ \
1 3
Assuming the traversal prints node values in order.
medium
A. [2, 1, 3]
B. [1, 3, 2]
C. [3, 2, 1]
D. [1, 2, 3]
Solution
Step 1: Understand inorder traversal order
Inorder traversal visits left subtree, root, then right subtree.
Step 2: Apply Morris traversal order
For the tree, left is 1, root is 2, right is 3, so output is [1, 2, 3].
Final Answer:
[1, 2, 3] -> Option D
Quick Check:
Inorder = left-root-right = [1, 2, 3] [OK]
Hint: Inorder = left, root, right always [OK]
Common Mistakes:
Confusing preorder or postorder with inorder
Misreading tree structure
Assuming traversal prints in insertion order
4. Consider this snippet of Morris inorder traversal code in Python:
current = root
while current:
if current.left is None:
print(current.val)
current = current.right
else:
pre = current.left
while pre.right and pre.right != current:
pre = pre.right
if pre.right is None:
pre.right = current
current = current.left
else:
pre.right = None
print(current.val)
current = current.right
What is the main bug if the line pre.right = None is missing?
medium
A. The traversal will print nodes in preorder instead of inorder.
B. The traversal will skip the root node.
C. The traversal will enter an infinite loop.
D. The traversal will cause a syntax error.
Solution
Step 1: Understand role of pre.right = None
This line removes the temporary thread created to return to the root after left subtree traversal.
Step 2: Consequence of missing this line
If not removed, the thread remains, causing the loop to revisit nodes endlessly, creating an infinite loop.
Final Answer:
The traversal will enter an infinite loop. -> Option C
Quick Check:
Missing thread removal = infinite loop [OK]
Hint: Always remove temporary threads to avoid loops [OK]
Common Mistakes:
Thinking it causes syntax error
Assuming it changes traversal order
Believing it skips nodes
5. You want to modify Morris inorder traversal to collect node values in a list instead of printing them. Which of the following code changes correctly achieves this without changing the traversal logic?
result = []
current = root
while current:
if current.left is None:
# Change here
current = current.right
else:
pre = current.left
while pre.right and pre.right != current:
pre = pre.right
if pre.right is None:
pre.right = current
current = current.left
else:
pre.right = None
# Change here
current = current.right
hard
A. Replace only second '# Change here' line with result.append(current.val)
B. Replace both '# Change here' lines with result.append(current.val)
C. Replace only first '# Change here' line with result.append(current.val)
D. Replace both '# Change here' lines with print(current.val)
Solution
Step 1: Identify where nodes are visited
In Morris traversal, nodes are visited and printed in two places: when left is None and after removing thread.
Step 2: Replace print with appending to list
To collect values, replace both print statements with result.append(current.val) to capture all visited nodes.
Final Answer:
Replace both '# Change here' lines with result.append(current.val) -> Option B
Quick Check:
Collect all visited nodes in list [OK]
Hint: Append values at both visit points to collect all nodes [OK]
Common Mistakes:
Appending only once misses some nodes
Leaving print statements causes unwanted output
Changing traversal logic breaks correctness
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.