Bird
Raised Fist0
DSA Goprogramming~10 mins

Tree Traversal Postorder Left Right Root in DSA Go - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to call the postorder traversal function recursively on the left child.

DSA Go
func postorder(node *Node) {
    if node == nil {
        return
    }
    postorder(node.[1])
    // Continue traversal
}
Drag options to blanks, or click blank then click option'
ALeft
BRight
CParent
DRoot
Attempts:
3 left
💡 Hint
Common Mistakes
Calling the function on the right child first.
Calling the function on the node itself again.
Using incorrect field names.
2fill in blank
medium

Complete the code to call the postorder traversal function recursively on the right child.

DSA Go
func postorder(node *Node) {
    if node == nil {
        return
    }
    postorder(node.Left)
    postorder(node.[1])
    // Continue traversal
}
Drag options to blanks, or click blank then click option'
ARight
BRoot
CLeft
DParent
Attempts:
3 left
💡 Hint
Common Mistakes
Calling the function on the left child again.
Calling the function on the node itself instead of a child.
Using incorrect field names.
3fill in blank
hard

Fix the error in the code to print the node's value after visiting its children.

DSA Go
func postorder(node *Node) {
    if node == nil {
        return
    }
    postorder(node.Left)
    postorder(node.Right)
    fmt.Println(node.[1])
}
Drag options to blanks, or click blank then click option'
ALeft
BRight
CValue
DParent
Attempts:
3 left
💡 Hint
Common Mistakes
Printing the left or right child instead of the node's value.
Printing the parent pointer which may not exist.
Forgetting to print anything.
4fill in blank
hard

Fill both blanks to complete the postorder traversal function that returns a slice of node values.

DSA Go
func postorderValues(node *Node) []int {
    if node == nil {
        return []int{}
    }
    left := postorderValues(node.[1])
    right := postorderValues(node.[2])
    return append(append(left, right...), node.Value)
}
Drag options to blanks, or click blank then click option'
ALeft
BRight
CParent
DRoot
Attempts:
3 left
💡 Hint
Common Mistakes
Swapping left and right children.
Using non-existent fields like Parent or Root.
Appending values in wrong order.
5fill in blank
hard

Fill all three blanks to build a map of node values to their depths during postorder traversal.

DSA Go
func postorderDepthMap(node *Node, depth int, m map[int]int) {
    if node == nil {
        return
    }
    postorderDepthMap(node.[1], depth+1, m)
    postorderDepthMap(node.[2], depth+1, m)
    m[[3]] = depth
}
Drag options to blanks, or click blank then click option'
ALeft
BRight
Cnode.Value
Ddepth
Attempts:
3 left
💡 Hint
Common Mistakes
Using depth as map key instead of node value.
Swapping left and right children.
Not increasing depth during recursion.

Practice

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

Solution

  1. Step 1: Understand postorder traversal definition

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

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

    Left subtree, Right subtree, Root node -> Option C
  4. Quick Check:

    Postorder = Left, Right, Root [OK]
Hint: Remember postorder ends with root after children [OK]
Common Mistakes:
  • Confusing postorder with preorder or inorder
  • Visiting root before children
  • Swapping left and right subtree order
2. Which of the following Go function signatures correctly represents a recursive postorder traversal of a binary tree node root?
easy
A. func postorder(root *Node) { postorder(root.Left); postorder(root.Right); fmt.Println(root.Value) }
B. func postorder(root *Node) { fmt.Println(root.Value); postorder(root.Left); postorder(root.Right) }
C. func postorder(root *Node) { postorder(root.Right); postorder(root.Left); fmt.Println(root.Value) }
D. func postorder(root *Node) { fmt.Println(root.Value); postorder(root.Right); postorder(root.Left) }

Solution

  1. Step 1: Recall postorder traversal steps

    Postorder visits left subtree, then right subtree, then root node.
  2. Step 2: Check function calls and print order

    func postorder(root *Node) { postorder(root.Left); postorder(root.Right); fmt.Println(root.Value) } calls postorder on left, then right, then prints root value, matching postorder.
  3. Final Answer:

    func postorder(root *Node) { postorder(root.Left); postorder(root.Right); fmt.Println(root.Value) } -> Option A
  4. Quick Check:

    Calls: Left, Right, Print root [OK]
Hint: Print root after recursive calls to left and right [OK]
Common Mistakes:
  • Printing root before recursive calls
  • Swapping left and right recursive calls
  • Missing recursive calls for subtrees
3. Given the binary tree below, what is the output of the postorder traversal?

      1
     / \
    2   3
   / \
  4   5
func postorder(root *Node) { if root == nil { return } postorder(root.Left) postorder(root.Right) fmt.Print(root.Value, " ") }
medium
A. 4 2 5 3 1
B. 1 2 4 5 3
C. 2 4 5 3 1
D. 4 5 2 3 1

Solution

  1. Step 1: Traverse left subtree of root (1)

    Left subtree is rooted at 2. Postorder of subtree 2 is: left(4), right(5), root(2) -> 4 5 2.
  2. Step 2: Traverse right subtree and root

    Right subtree is 3 (leaf), so output 3. Then print root 1 last.
  3. Final Answer:

    4 5 2 3 1 -> Option D
  4. Quick Check:

    Postorder = Left, Right, Root = 4 5 2 3 1 [OK]
Hint: Visit left subtree fully, then right, then root [OK]
Common Mistakes:
  • Printing root before children
  • Mixing left and right subtree order
  • Skipping leaf nodes
4. The following Go code attempts a postorder traversal but produces incorrect output. What is the error?

func postorder(root *Node) {
  if root == nil {
    return
  }
  postorder(root.Right)
  postorder(root.Left)
  fmt.Print(root.Value, " ")
}
medium
A. The order of recursive calls is swapped; left should be before right
B. The base case is missing for nil nodes
C. The root value should be printed before recursive calls
D. The function should return a slice instead of printing

Solution

  1. Step 1: Analyze recursive call order

    The code calls postorder on right subtree first, then left subtree, which reverses the expected order.
  2. Step 2: Recall correct postorder sequence

    Postorder requires left subtree first, then right subtree, then root. Swapping left and right causes wrong output.
  3. Final Answer:

    The order of recursive calls is swapped; left should be before right -> Option A
  4. Quick Check:

    Left before Right in postorder [OK]
Hint: Left subtree call must come before right subtree call [OK]
Common Mistakes:
  • Swapping left and right subtree calls
  • Printing root before children
  • Ignoring base case for nil
5. You want to collect the values of a binary tree in postorder traversal into a slice instead of printing. Which Go function correctly implements this?
hard
A. func postorder(root *Node, res *[]int) { if root == nil { return } postorder(root.Right, res) postorder(root.Left, res) *res = append(*res, root.Value) }
B. func postorder(root *Node) []int { if root == nil { return []int{} } left := postorder(root.Left) right := postorder(root.Right) return append(left, append(right, root.Value)...) }
C. func postorder(root *Node, res *[]int) { if root == nil { return } *res = append(*res, root.Value) postorder(root.Left, res) postorder(root.Right, res) }
D. func postorder(root *Node) []int { if root == nil { return nil } return []int{root.Value} }

Solution

  1. Step 1: Understand collecting values in slice recursively

    We want a function returning a slice with postorder values: left subtree slice + right subtree slice + root value.
  2. Step 2: Check each option for correct order and slice handling

    func postorder(root *Node) []int { if root == nil { return []int{} } left := postorder(root.Left) right := postorder(root.Right) return append(left, append(right, root.Value)...) } correctly returns left slice, then appends right slice, then root value, matching postorder traversal.
  3. Final Answer:

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

    Return slices: left + right + root [OK]
Hint: Return left + right + root slices combined [OK]
Common Mistakes:
  • Appending root before children slices
  • Not combining slices correctly
  • Returning nil instead of empty slice for nil node
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