Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example: Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]

Solution:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func zigzagLevelOrder(root *TreeNode) [][]int {
  var ans [][]int
  if root == nil {
    return ans
  }

  curLevel := []*TreeNode{root}
  level := 0
  for len(curLevel) != 0 {
    var curLevelVal []int
    var nextLevel []*TreeNode

    for _, node := range curLevel {
      curLevelVal = append(curLevelVal, node.Val)
      if node.Left != nil {
        nextLevel = append(nextLevel, node.Left)
      }
      if node.Right != nil {
        nextLevel = append(nextLevel, node.Right)
      }
    }

    if level % 2 == 0 {
      ans = append(ans, curLevelVal)
    } else {
      ans = append(ans, reverse(curLevelVal))
    }
    level++
    curLevel = nextLevel
  }

  return ans
}

func reverse(arr []int) []int {
  l, r := 0, len(arr) - 1
  for l < r {
    arr[l], arr[r] = arr[r], arr[l]
    l++
    r--
  }
  return arr
}