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) }
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].
Zigzag traversal alternates direction by level number: even levels are traversed left to right, odd levels right to left.
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.
A complete binary tree of height 3 has exactly 3 levels, so the traversal output will have 3 lists.
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) }
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].
