Challenge - 5 Problems
Zigzag Traversal Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
Output of Zigzag Level Order Traversal on a Binary Tree
What is the output of the zigzag level order traversal for the given binary tree?
DSA Go
package main import "fmt" type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func zigzagLevelOrder(root *TreeNode) [][]int { if root == nil { return [][]int{} } var result [][]int var currentLevel []*TreeNode currentLevel = append(currentLevel, root) leftToRight := true for len(currentLevel) > 0 { var levelVals []int var nextLevel []*TreeNode for _, node := range currentLevel { levelVals = append(levelVals, node.Val) } if !leftToRight { for i, j := 0, len(levelVals)-1; i < j; i, j = i+1, j-1 { levelVals[i], levelVals[j] = levelVals[j], levelVals[i] } } for _, node := range currentLevel { if node.Left != nil { nextLevel = append(nextLevel, node.Left) } if node.Right != nil { nextLevel = append(nextLevel, node.Right) } } result = append(result, levelVals) currentLevel = nextLevel leftToRight = !leftToRight } return result } func main() { root := &TreeNode{Val: 1} root.Left = &TreeNode{Val: 2} root.Right = &TreeNode{Val: 3} root.Left.Left = &TreeNode{Val: 4} root.Left.Right = &TreeNode{Val: 5} root.Right.Right = &TreeNode{Val: 6} result := zigzagLevelOrder(root) fmt.Println(result) }
Attempts:
2 left
💡 Hint
Remember that zigzag means alternating the order of nodes at each level.
✗ Incorrect
The traversal starts left to right at level 0, so [1]. Then it goes right to left at level 1, so [3, 2]. Finally, it goes left to right at level 2, so [4, 5, 6].
🧠 Conceptual
intermediate1:30remaining
Understanding Zigzag Level Order Traversal Direction
In zigzag level order traversal, what determines the order of nodes at each level?
Attempts:
2 left
💡 Hint
Think about how the traversal direction changes as you go down levels.
✗ Incorrect
Zigzag traversal alternates direction by level number: even levels are traversed left to right, odd levels right to left.
🔧 Debug
advanced2:30remaining
Identify the Bug in Zigzag Traversal Code
What error will this code produce when run, and why?
func zigzagLevelOrder(root *TreeNode) [][]int {
if root == nil {
return [][]int{}
}
var result [][]int
var currentLevel []*TreeNode
currentLevel = append(currentLevel, root)
leftToRight := true
for len(currentLevel) > 0 {
var levelVals []int
var nextLevel []*TreeNode
for i := len(currentLevel) - 1; i >= 0; i-- {
node := currentLevel[i]
levelVals = append(levelVals, node.Val)
if leftToRight {
if node.Left != nil {
nextLevel = append(nextLevel, node.Left)
}
if node.Right != nil {
nextLevel = append(nextLevel, node.Right)
}
} else {
if node.Right != nil {
nextLevel = append(nextLevel, node.Right)
}
if node.Left != nil {
nextLevel = append(nextLevel, node.Left)
}
}
}
result = append(result, levelVals)
currentLevel = nextLevel
leftToRight = !leftToRight
}
return result
}
Attempts:
2 left
💡 Hint
Check how nextLevel nodes are added and in what order.
✗ Incorrect
The order of adding children to nextLevel is wrong because appending in this order while iterating backwards causes the next level to be in incorrect order, breaking the zigzag pattern.
🚀 Application
advanced1:00remaining
Number of Levels in Zigzag Traversal Output
Given a binary tree with 7 nodes arranged as a complete binary tree of height 3, how many levels will the zigzag level order traversal output contain?
Attempts:
2 left
💡 Hint
Think about how many levels a complete binary tree of height 3 has.
✗ Incorrect
A complete binary tree of height 3 has exactly 3 levels, so the traversal output will have 3 lists.
❓ Predict Output
expert3:00remaining
Output of Zigzag Traversal on Unbalanced Tree
What is the output of the zigzag level order traversal for this unbalanced binary tree?
Tree structure:
- Root: 10
- Root.Left: 5
- Root.Left.Left: 3
- Root.Left.Left.Left: 1
- Root.Right: 15
- Root.Right.Right: 20
DSA Go
package main import "fmt" type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func zigzagLevelOrder(root *TreeNode) [][]int { if root == nil { return [][]int{} } var result [][]int var currentLevel []*TreeNode currentLevel = append(currentLevel, root) leftToRight := true for len(currentLevel) > 0 { var levelVals []int var nextLevel []*TreeNode for _, node := range currentLevel { levelVals = append(levelVals, node.Val) } if !leftToRight { for i, j := 0, len(levelVals)-1; i < j; i, j = i+1, j-1 { levelVals[i], levelVals[j] = levelVals[j], levelVals[i] } } for _, node := range currentLevel { if node.Left != nil { nextLevel = append(nextLevel, node.Left) } if node.Right != nil { nextLevel = append(nextLevel, node.Right) } } result = append(result, levelVals) currentLevel = nextLevel leftToRight = !leftToRight } return result } func main() { root := &TreeNode{Val: 10} root.Left = &TreeNode{Val: 5} root.Left.Left = &TreeNode{Val: 3} root.Left.Left.Left = &TreeNode{Val: 1} root.Right = &TreeNode{Val: 15} root.Right.Right = &TreeNode{Val: 20} result := zigzagLevelOrder(root) fmt.Println(result) }
Attempts:
2 left
💡 Hint
Remember to alternate the order of nodes at each level, even if the tree is unbalanced.
✗ Incorrect
The traversal starts left to right at level 0: [10]. Then right to left at level 1: [15, 5]. Then left to right at level 2: [3, 20]. Finally right to left at level 3: [1].