📖 Scenario: You are working with a binary tree data structure. Normally, to visit all nodes in order (left, root, right), you use extra memory like a stack or recursion. But here, you will learn a clever way to do this without extra memory, called Morris Traversal.This method temporarily changes the tree links to remember where to go next, then restores the tree back to normal.
🎯 Goal: Build a program that performs an inorder traversal of a binary tree using Morris Traversal technique without using stack or recursion. The program will print the values of nodes in inorder sequence.
📋 What You'll Learn
Create a binary tree node structure with integer data and left and right pointers
Build a sample binary tree with exact nodes and structure
Implement Morris Traversal inorder function without using stack or recursion
Print the inorder traversal output as space-separated node values
💡 Why This Matters
🌍 Real World
Morris Traversal is useful in systems with limited memory where recursion or stack usage is costly, such as embedded systems or large trees.
💼 Career
Understanding Morris Traversal shows mastery of tree traversal algorithms and memory optimization, valuable for software engineers working on performance-critical applications.
Progress0 / 4 steps
1
Create the Binary Tree Node Structure and Sample Tree
Define a struct called Node with an int data, and two pointers Node* left and Node* right. Then create a binary tree with root node root having value 1, left child 2, right child 3, left child's left child 4, and left child's right child 5.
DSA C++
Hint
Start by defining the node structure with constructor. Then create nodes and link them exactly as described.
2
Create a Pointer Variable for Traversal
Create a pointer variable called current and set it to point to the root node.
DSA C++
Hint
Just create a pointer named current and assign it the root node.
3
Implement Morris Inorder Traversal Logic
Write a while loop that runs while current is not nullptr. Inside the loop, if current->left is nullptr, print current->data followed by a space, then move current to current->right. Otherwise, find the rightmost node in current->left subtree (called predecessor). If predecessor->right is nullptr, set it to current and move current to current->left. Else, set predecessor->right to nullptr, print current->data followed by a space, and move current to current->right.
DSA C++
Hint
Use the Morris Traversal steps carefully: find predecessor, create temporary link, print data when left is null or after restoring links.
4
Print the Final Inorder Traversal Output
Add a std::cout statement to print a newline character after the Morris traversal loop to end the output cleanly.
DSA C++
Hint
After printing all nodes with spaces, print a newline to end output cleanly.
Practice
(1/5)
1. What is the main advantage of using Morris Traversal for inorder tree traversal compared to the traditional recursive or stack-based methods?
easy
A. It sorts the tree nodes during traversal
B. It is faster because it uses multiple threads
C. It requires the tree to be a binary search tree
D. It uses no extra space for stack or recursion, only modifies tree temporarily
Solution
Step 1: Understand Morris Traversal space usage
Morris Traversal does not use recursion or an explicit stack, instead it temporarily modifies the tree's right pointers to traverse.
Step 2: Compare with traditional methods
Traditional inorder traversal uses recursion or a stack, which requires extra memory proportional to tree height.
Final Answer:
It uses no extra space for stack or recursion, only modifies tree temporarily -> Option D
Quick Check:
Space efficiency = No extra stack [OK]
Hint: Morris uses tree links, no stack or recursion needed [OK]
Common Mistakes:
Thinking Morris sorts nodes
Assuming it needs a binary search tree
Believing it uses threads or parallelism
2. Which of the following code snippets correctly initializes the current pointer for Morris inorder traversal in C++?
easy
A. Node current = root;
B. Node* current = root;
C. Node* current = new Node(root);
D. Node current = *root;
Solution
Step 1: Understand pointer usage in C++ for tree traversal
We need a pointer to traverse nodes, so current should be a pointer to Node initialized to root pointer.
Step 2: Analyze options
Node* current = root; correctly declares a pointer and assigns root. Options B and D declare objects, not pointers. Node* current = new Node(root); incorrectly uses new with root pointer.
Final Answer:
Node* current = root; -> Option B
Quick Check:
Pointer initialization = Node* current = root [OK]
Hint: Use pointer Node* current = root for traversal [OK]
Common Mistakes:
Declaring current as object instead of pointer
Using new operator incorrectly
Dereferencing root without pointer
3. Consider the following C++ code snippet implementing Morris inorder traversal on a binary tree with nodes 1, 2, 3 where 1 is root, 2 is left child, and 3 is right child. What is the output printed?
Missing check pre->right != current causes loop to never break when pre->right points back to current, causing infinite loop.
Final Answer:
The inner while loop misses checking pre->right != current causing infinite loop -> Option A
Quick Check:
Loop condition must check pre->right != current [OK]
Hint: Check inner loop condition includes pre->right != current [OK]
Common Mistakes:
Ignoring second condition in inner loop
Forgetting to update current after printing
Not handling empty tree
5. You want to modify Morris inorder traversal to count the number of nodes in a binary tree without using extra space or recursion. Which modification is correct?
void morrisCount(Node* root) {
int count = 0;
Node* current = root;
while (current != nullptr) {
if (current->left == nullptr) {
count++;
current = current->right;
} else {
Node* pre = current->left;
while (pre->right != nullptr && pre->right != current) {
pre = pre->right;
}
if (pre->right == nullptr) {
pre->right = current;
current = current->left;
} else {
pre->right = nullptr;
count++;
current = current->right;
}
}
}
std::cout << count << std::endl;
}
hard
A. This code correctly counts nodes using Morris traversal without extra space
B. Counting should be done only when pre->right is nullptr
C. Count variable must be global to work correctly
D. Morris traversal cannot be used to count nodes without recursion
Solution
Step 1: Understand counting during Morris traversal
Count nodes when visiting them: when left is nullptr or after restoring links (pre->right == current).
Step 2: Verify code increments count correctly
Code increments count in both cases correctly, so it counts all nodes without extra space or recursion.
Final Answer:
This code correctly counts nodes using Morris traversal without extra space -> Option A
Quick Check:
Count increments on node visit = correct [OK]
Hint: Increment count on node visit before moving right [OK]
Common Mistakes:
Counting only once per node visit
Making count global unnecessarily
Assuming Morris can't count nodes
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.