Bird
Raised Fist0
DSA Goprogramming~10 mins

Tree Traversal Preorder Root Left Right in DSA Go - Execution Trace

Choose your learning style10 modes available
Concept Flow - Tree Traversal Preorder Root Left Right
Start at Root Node
↓
Visit Node (Process Data)
↓
Traverse Left Subtree
↓
Traverse Right Subtree
↓
Return to Parent or End
Start at the root, visit it, then recursively visit left subtree, then right subtree.
Execution Sample
DSA Go
func preorder(node *Node) {
  if node == nil {
    return
  }
  fmt.Println(node.value)
  preorder(node.left)
  preorder(node.right)
}
This code prints nodes in preorder: root first, then left subtree, then right subtree.
Execution Table
StepOperationNode VisitedPointer ChangesTree State (Visual)
1Visit rootAcurrent = AA ├─ B └─ C
2Traverse left subtreeBcurrent = BA ├─ B └─ C
3Visit nodeBnoneA ├─ B └─ C
4Traverse left subtreeDcurrent = DA ├─ B │ ├─ D │ └─ E └─ C
5Visit nodeDnoneA ├─ B │ ├─ D │ └─ E └─ C
6Traverse left subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C
7Return from nilnilback to DA ├─ B │ ├─ D │ └─ E └─ C
8Traverse right subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C
9Return from nilnilback to BA ├─ B │ ├─ D │ └─ E └─ C
10Traverse right subtreeEcurrent = EA ├─ B │ ├─ D │ └─ E └─ C
11Visit nodeEnoneA ├─ B │ ├─ D │ └─ E └─ C
12Traverse left subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C
13Return from nilnilback to EA ├─ B │ ├─ D │ └─ E └─ C
14Traverse right subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C
15Return from nilnilback to BA ├─ B │ ├─ D │ └─ E └─ C
16Return from BBback to AA ├─ B │ ├─ D │ └─ E └─ C
17Traverse right subtreeCcurrent = CA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
18Visit nodeCnoneA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
19Traverse left subtreeFcurrent = FA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
20Visit nodeFnoneA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
21Traverse left subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
22Return from nilnilback to FA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
23Traverse right subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
24Return from nilnilback to CA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
25Traverse right subtreeGcurrent = GA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
26Visit nodeGnoneA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
27Traverse left subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
28Return from nilnilback to GA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
29Traverse right subtreenilcurrent = nilA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
30Return from nilnilback to CA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
31Return from CCback to AA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
32Return from rootATraversal completeA ├─ B │ ├─ D │ └─ E └─ C ├─ F └─ G
💡 Traversal ends after visiting all nodes in preorder: A, B, D, E, C, F, G
Variable Tracker
VariableStartAfter Step 1After Step 4After Step 10After Step 17After Step 25Final
currentnilADECGnil
visited_nodes[][A][A, B, D][A, B, D, E][A, B, D, E, C][A, B, D, E, C, F, G][A, B, D, E, C, F, G]
Key Moments - 3 Insights
Why do we visit the node before traversing its left and right children?
Because preorder means Root-Left-Right, so visiting the node first is shown in execution_table rows 1, 3, 5, 11, 18, 20, 26 where the node is printed before moving to children.
What happens when the traversal reaches a nil (empty) child?
The function returns immediately without visiting, as shown in steps 6, 8, 12, 14, 21, 23, 27, 29 where current becomes nil and returns back to parent node.
How does the traversal know when to return to the parent node?
When both left and right children are nil or fully visited, the recursion returns to the previous call, as seen in steps 9, 15, 16, 24, 30, 31, and finally 32 when traversal ends.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what node is visited at step 10?
AE
BD
CB
DC
💡 Hint
Check the 'Node Visited' column at step 10 in execution_table.
At which step does the traversal first return from a nil child?
AStep 15
BStep 9
CStep 6
DStep 21
💡 Hint
Look for 'Return from nil' in the 'Operation' column in execution_table.
If the left child of node B was missing, how would the visited_nodes list change after step 10?
A[A, B, D, E]
B[A, B, E]
C[A, B]
D[A, B, D]
💡 Hint
Refer to variable_tracker's 'visited_nodes' and consider skipping node D.
Concept Snapshot
Preorder Traversal visits nodes in Root-Left-Right order.
Start at root, visit node, then recursively traverse left subtree, then right subtree.
If node is nil, return immediately.
Useful for copying trees or prefix expressions.
Output order example: A, B, D, E, C, F, G.
Full Transcript
Preorder tree traversal means visiting the root node first, then the left subtree, and finally the right subtree. The code visits a node by printing its value, then recursively calls itself on the left child, then on the right child. When a nil child is reached, the function returns immediately. The traversal ends after all nodes are visited in this order. This method is useful for tasks like copying a tree or evaluating prefix expressions.

Practice

(1/5)
1. What is the order of nodes visited in a preorder tree traversal?
easy
A. Root, Left, Right
B. Left, Root, Right
C. Left, Right, Root
D. Right, Left, Root

Solution

  1. Step 1: Understand preorder traversal definition

    Preorder traversal visits the root node first, then the left subtree, and finally the right subtree.
  2. Step 2: Match the order with options

    Root, Left, Right matches the order Root, Left, Right exactly.
  3. Final Answer:

    Root, Left, Right -> Option A
  4. Quick Check:

    Preorder = Root, Left, Right [OK]
Hint: Remember preorder starts with root node first [OK]
Common Mistakes:
  • Confusing preorder with inorder or postorder
  • Swapping left and right subtree order
  • Starting traversal from left child instead of root
2. Which of the following Go function signatures correctly represents a preorder traversal function for a binary tree node Node?
easy
A. func preorder(root *Node) { if root == nil { return } preorder(root.Left) preorder(root.Right) fmt.Println(root.Value) }
B. func preorder(root *Node) { if root == nil { return } fmt.Println(root.Value) preorder(root.Left) preorder(root.Right) }
C. func preorder(root *Node) { if root == nil { return } preorder(root.Right) fmt.Println(root.Value) preorder(root.Left) }
D. func preorder(root *Node) { if root == nil { return } preorder(root.Left) fmt.Println(root.Value) preorder(root.Right) }

Solution

  1. Step 1: Recall preorder traversal order

    Preorder visits root first, then left subtree, then right subtree.
  2. Step 2: Check function order

    func preorder(root *Node) { if root == nil { return } fmt.Println(root.Value) preorder(root.Left) preorder(root.Right) } prints root value first, then recursively visits left and right children, matching preorder.
  3. Final Answer:

    func preorder(root *Node) { if root == nil { return } fmt.Println(root.Value) preorder(root.Left) preorder(root.Right) } -> Option B
  4. Quick Check:

    Print root before children calls [OK]
Hint: Print root value before recursive calls [OK]
Common Mistakes:
  • Printing after recursive calls (postorder)
  • Swapping left and right recursive calls
  • Missing nil check for root
3. Given the binary tree below, what is the preorder traversal output?

    10
   /  \
  5    15
 /    /  \
3    12  20
func preorder(root *Node) { if root == nil { return } fmt.Print(root.Value, " ") preorder(root.Left) preorder(root.Right) }
medium
A. [5, 3, 10, 15, 12, 20]
B. [3, 5, 10, 12, 15, 20]
C. [10, 15, 20, 12, 5, 3]
D. [10, 5, 3, 15, 12, 20]

Solution

  1. Step 1: Start at root node 10

    Print 10, then traverse left subtree.
  2. Step 2: Traverse left subtree (5, then 3)

    Print 5, then left child 3, which has no children.
  3. Step 3: Traverse right subtree (15, 12, 20)

    Print 15, then left child 12, then right child 20.
  4. Final Answer:

    [10, 5, 3, 15, 12, 20] -> Option D
  5. Quick Check:

    Preorder = Root, Left, Right [OK]
Hint: Follow root, then left subtree, then right subtree order [OK]
Common Mistakes:
  • Mixing preorder with inorder or postorder output
  • Visiting right subtree before left
  • Skipping leaf nodes
4. The following Go code attempts a preorder traversal but produces incorrect output. What is the error?

func preorder(root *Node) {
  if root == nil {
    return
  }
  preorder(root.Left)
  fmt.Print(root.Value, " ")
  preorder(root.Right)
}
medium
A. The function uses fmt.Print instead of fmt.Println
B. The function does not check for nil root
C. The root value is printed after left subtree traversal, not before
D. The right subtree is traversed before the left subtree

Solution

  1. Step 1: Analyze print position in code

    The root value is printed after preorder(root.Left), so root is visited after left subtree.
  2. Step 2: Compare with preorder definition

    Preorder requires visiting root first, then left, then right. This code visits left first, then root, then right (inorder).
  3. Final Answer:

    The root value is printed after left subtree traversal, not before -> Option C
  4. Quick Check:

    Print root before children for preorder [OK]
Hint: Print root value before recursive calls to fix order [OK]
Common Mistakes:
  • Confusing preorder with inorder traversal
  • Ignoring nil check (though present here)
  • Thinking print function choice affects traversal order
5. You want to collect all node values of a binary tree in preorder traversal into a slice in Go. Which code snippet correctly does this?
hard
A. func preorder(root *Node, result *[]int) { if root == nil { return } *result = append(*result, root.Value) preorder(root.Left, result) preorder(root.Right, result) }
B. func preorder(root *Node, result []int) []int { if root == nil { return result } result = append(result, root.Value) preorder(root.Left, result) preorder(root.Right, result) return result }
C. func preorder(root *Node) []int { if root == nil { return nil } left := preorder(root.Left) right := preorder(root.Right) return append(left, append(right, root.Value)...) }
D. func preorder(root *Node, result *[]int) { if root == nil { return } preorder(root.Left, result) preorder(root.Right, result) *result = append(*result, root.Value) }

Solution

  1. Step 1: Understand preorder collection logic

    Preorder means add root value first, then traverse left and right subtrees.
  2. Step 2: Check each option's order and parameter usage

    func preorder(root *Node, result *[]int) { if root == nil { return } *result = append(*result, root.Value) preorder(root.Left, result) preorder(root.Right, result) } appends root value first, then recursively traverses left and right, using pointer to slice to collect values correctly.
  3. Final Answer:

    func preorder(root *Node, result *[]int) { if root == nil { return } *result = append(*result, root.Value) preorder(root.Left, result) preorder(root.Right, result) } -> Option A
  4. Quick Check:

    Append root first, use pointer to slice [OK]
Hint: Append root value before recursive calls, pass slice pointer [OK]
Common Mistakes:
  • Appending after recursive calls (wrong order)
  • Passing slice by value and expecting changes
  • Appending right subtree before left subtree
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