0
0
DSA Goprogramming~20 mins

Morris Traversal Inorder Without Stack in DSA Go - Practice Problems & Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Morris Traversal Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of Morris Inorder Traversal on a Simple Tree
What is the output of the Morris inorder traversal on the following binary tree?

Tree structure:
2
/ \
1 3

Assume the traversal prints node values separated by spaces.
DSA Go
package main

import "fmt"

type Node struct {
    Val   int
    Left  *Node
    Right *Node
}

func morrisInorder(root *Node) {
    current := root
    for current != nil {
        if current.Left == nil {
            fmt.Print(current.Val, " ")
            current = current.Right
        } else {
            pre := current.Left
            for pre.Right != nil && pre.Right != current {
                pre = pre.Right
            }
            if pre.Right == nil {
                pre.Right = current
                current = current.Left
            } else {
                pre.Right = nil
                fmt.Print(current.Val, " ")
                current = current.Right
            }
        }
    }
}

func main() {
    root := &Node{Val: 2}
    root.Left = &Node{Val: 1}
    root.Right = &Node{Val: 3}
    morrisInorder(root)
}
A1 2 3
B2 1 3
C3 2 1
D1 3 2
Attempts:
2 left
💡 Hint
Inorder traversal visits left subtree, then node, then right subtree.
Predict Output
intermediate
2:00remaining
Output of Morris Inorder Traversal on a Tree with Only Left Children
What is the output of the Morris inorder traversal on this tree?

Tree structure:
4
/
3
/
2
/
1

Assume the traversal prints node values separated by spaces.
DSA Go
package main

import "fmt"

type Node struct {
    Val   int
    Left  *Node
    Right *Node
}

func morrisInorder(root *Node) {
    current := root
    for current != nil {
        if current.Left == nil {
            fmt.Print(current.Val, " ")
            current = current.Right
        } else {
            pre := current.Left
            for pre.Right != nil && pre.Right != current {
                pre = pre.Right
            }
            if pre.Right == nil {
                pre.Right = current
                current = current.Left
            } else {
                pre.Right = nil
                fmt.Print(current.Val, " ")
                current = current.Right
            }
        }
    }
}

func main() {
    root := &Node{Val: 4}
    root.Left = &Node{Val: 3}
    root.Left.Left = &Node{Val: 2}
    root.Left.Left.Left = &Node{Val: 1}
    morrisInorder(root)
}
A1 3 2 4
B1 2 3 4
C4 3 2 1
D2 1 3 4
Attempts:
2 left
💡 Hint
Inorder traversal visits nodes from smallest to largest in this left-skewed tree.
🔧 Debug
advanced
3:00remaining
Identify the Bug in Morris Traversal Code
The following Go code attempts Morris inorder traversal but produces incorrect output. What is the bug?
DSA Go
func morrisInorder(root *Node) {
    current := root
    for current != nil {
        if current.Left == nil {
            fmt.Print(current.Val, " ")
            current = current.Right
        } else {
            pre := current.Left
            for pre.Right != nil {
                pre = pre.Right
            }
            if pre.Right == nil {
                pre.Right = current
                current = current.Left
            } else {
                pre.Right = nil
                fmt.Print(current.Val, " ")
                current = current.Right
            }
        }
    }
}
AThe inner loop misses checking if pre.Right == current, causing infinite loop or wrong threading.
BThe code should print current.Val before setting pre.Right = current.
CThe code incorrectly sets pre.Left instead of pre.Right.
DThe code should move current to current.Right before printing current.Val.
Attempts:
2 left
💡 Hint
Check the condition inside the inner while loop that finds the predecessor.
🧠 Conceptual
advanced
1:30remaining
Why Morris Traversal Uses Threaded Links
Why does Morris inorder traversal create temporary links (threads) from the inorder predecessor to the current node?
ATo permanently modify the tree structure for faster future traversals.
BTo store node values temporarily during traversal.
CTo avoid using a stack or recursion by remembering where to return after visiting left subtree.
DTo balance the tree dynamically during traversal.
Attempts:
2 left
💡 Hint
Think about how recursion or stack remembers the path back to a node.
🚀 Application
expert
2:30remaining
Count Nodes Using Morris Traversal Without Extra Space
Using Morris inorder traversal, how can you count the total number of nodes in a binary tree without using recursion or a stack?
ACount nodes by traversing only right children and ignoring left children.
BCount nodes by incrementing counter only when creating a thread link.
CCount nodes by incrementing counter only when removing a thread link.
DTraverse the tree with Morris inorder and increment a counter each time a node is visited (printed).
Attempts:
2 left
💡 Hint
Each node is visited exactly once in inorder traversal.