Bird
Raised Fist0
DSA C#programming~30 mins

Morris Traversal Inorder Without Stack in DSA C# - Build from Scratch

Choose your learning style10 modes available
Morris Traversal Inorder Without Stack
📖 Scenario: You are working with a binary tree data structure. You want to visit all the nodes in the tree in order (left, root, right) without using extra memory like a stack or recursion.This technique is called Morris Traversal. It temporarily changes the tree structure to remember where to go next.
🎯 Goal: Build a program that performs an inorder traversal of a binary tree using Morris Traversal technique and prints the node values in order.
📋 What You'll Learn
Create a binary tree node class with integer value and left/right children
Build a sample binary tree with specific nodes
Implement Morris Traversal inorder method without using stack or recursion
Print the node values in inorder sequence separated by spaces
💡 Why This Matters
🌍 Real World
Morris Traversal is useful when memory is limited and you want to traverse a binary tree without using extra space for recursion or stack.
💼 Career
Understanding Morris Traversal helps in optimizing tree traversal algorithms and is useful in technical interviews and performance-critical applications.
Progress0 / 4 steps
1
Create the Binary Tree Node Class and Sample Tree
Create a class called TreeNode with an integer field val, and two TreeNode fields called left and right. Then create a binary tree with root node value 1, root's left child value 2, root's right child value 3, left child's left child value 4, and left child's right child value 5. Store the root node in a variable called root.
DSA C#
Hint

Define the TreeNode class with constructor and create the tree nodes exactly as described.

2
Add a Variable to Traverse the Tree
Create a variable called current and set it equal to the root node. This variable will help us move through the tree during traversal.
DSA C#
Hint

Just assign current to root to start traversal from the root node.

3
Implement Morris Inorder Traversal Logic
Write a while loop that runs while current is not null. Inside the loop, if current.left is null, print current.val followed by a space and move current to current.right. Otherwise, find the rightmost node in current.left subtree (called predecessor). If predecessor.right is null, set it to current and move current to current.left. If predecessor.right is current, set it back to null, print current.val followed by a space, and move current to current.right.
DSA C#
Hint

Use the Morris Traversal steps carefully: find predecessor, create temporary link, remove it after visiting.

4
Print the Final Inorder Traversal Output
Run the program to print the inorder traversal of the tree using Morris Traversal. The output should be the node values separated by spaces in this order: 4 2 5 1 3 .
DSA C#
Hint

Run the program and check that the output matches the inorder sequence.

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 works only on binary search trees.
B. It is faster than all other traversal methods.
C. It uses no extra space for stack or recursion.
D. It modifies the tree permanently.

Solution

  1. 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.
  2. Step 2: Compare with other methods

    Recursive and stack-based traversals use O(h) space where h is tree height, so Morris Traversal saves memory.
  3. Final Answer:

    It uses no extra space for stack or recursion. -> Option C
  4. Quick Check:

    Space complexity = O(1) [OK]
Hint: Morris Traversal uses threading to avoid extra space [OK]
Common Mistakes:
  • Thinking it is faster than recursive traversal
  • Assuming it only works on BSTs
  • Believing it permanently changes the tree
2. Which of the following C# code snippets correctly initializes the current node for Morris inorder traversal?
easy
A. TreeNode current = root;
B. TreeNode current = null;
C. TreeNode current = root.left;
D. TreeNode current = root.right;

Solution

  1. Step 1: Identify starting point for traversal

    Morris traversal starts from the root node to cover the entire tree.
  2. Step 2: Check initialization correctness

    Initializing current as root ensures traversal begins at the tree's root.
  3. Final Answer:

    TreeNode current = root; -> Option A
  4. Quick Check:

    Start traversal at root node [OK]
Hint: Start traversal from root node always [OK]
Common Mistakes:
  • Starting from null causes no traversal
  • Starting from left or right child misses nodes
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 separated by spaces.
medium
A. 3 2 1
B. 1 2 3
C. 2 1 3
D. 1 3 2

Solution

  1. Step 1: Understand inorder traversal order

    Inorder traversal visits left subtree, root, then right subtree.
  2. Step 2: Apply Morris traversal order on given tree

    Left child 1, then root 2, then right child 3 results in "1 2 3".
  3. Final Answer:

    1 2 3 -> Option B
  4. Quick Check:

    Inorder = left-root-right = 1 2 3 [OK]
Hint: Inorder = left, root, right [OK]
Common Mistakes:
  • Confusing preorder or postorder with inorder
  • Misreading tree structure
4. Consider this snippet of Morris inorder traversal code in C#:

while (current != null) {
    if (current.left == null) {
        Console.Write(current.val + " ");
        current = current.right;
    } else {
        TreeNode predecessor = current.left;
        while (predecessor.right != null && predecessor.right == current) {
            predecessor = predecessor.right;
        }
        if (predecessor.right == null) {
            predecessor.right = current;
            current = current.left;
        } else {
            predecessor.right = null;
            Console.Write(current.val + " ");
            current = current.right;
        }
    }
}
What is the bug in this code?
medium
A. The code does not handle the case when current.left is null.
B. The Console.Write statements should be outside the if-else blocks.
C. The predecessor.right pointer is never reset to null, causing infinite loop.
D. The inner while loop should check predecessor.right != current instead of predecessor.right == current.

Solution

  1. Step 1: Analyze inner while loop condition

    The loop should continue while predecessor.right != null && predecessor.right != current to reach the rightmost node in left subtree.
  2. Step 2: Check given condition correctness

    The code uses predecessor.right == current, which fails to traverse the right chain properly, as it only continues if already threaded back.
  3. Step 3: Why other options are wrong

    A: left null is handled in if. C: reset happens in else. D: print placement is correct for inorder.
  4. Final Answer:

    The inner while loop should check predecessor.right != current instead of predecessor.right == current. -> Option D
  5. Quick Check:

    Loop condition must be != null && != current [OK]
Hint: Check loop conditions carefully to avoid infinite loops [OK]
Common Mistakes:
  • Confusing loop condition signs
  • Forgetting to reset threaded pointers
  • Misplacing print statements
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?
hard
A. Increment a counter each time you print a node's value during traversal.
B. Increment a counter only when you create a threaded link.
C. Increment a counter only when you remove a threaded link.
D. Increment a counter only when current.left is null.

Solution

  1. Step 1: Identify when nodes are visited in Morris traversal

    Nodes are visited (printed) when current.left is null or after removing threaded link.
  2. Step 2: Counting nodes correctly

    Incrementing counter when printing nodes ensures counting all nodes exactly once.
  3. Step 3: Why other options fail

    Incrementing only on creating or removing threaded links misses nodes or counts duplicates.
  4. Final Answer:

    Increment a counter each time you print a node's value during traversal. -> Option A
  5. Quick Check:

    Count nodes when visiting them [OK]
Hint: Count nodes when printing during traversal [OK]
Common Mistakes:
  • Counting on threaded link creation/removal
  • Counting only left-null nodes
  • Missing some nodes in count
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard