103. 二叉树的之字形形层次遍历

103. 二叉树的之字形形层次遍历

103. 二叉树的之字形形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历。
即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行。

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回锯齿形层次遍历如下:

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

解析

func zigzagLevelOrder(root *TreeNode) [][]int {
	var result [][]int
	if root == nil {
		return result
	}
	level := []*TreeNode{root}
	toRight := true
	for len(level) > 0 {
		result = append(result, travasLevel(level, toRight))
		level = genNext(level)
		toRight = !toRight
	}
	return result
}

func travasLevel(level []*TreeNode, toRight bool) []int {
	result := make([]int, 0, len(level))
	if toRight {
		for _, n := range level {
			result = append(result, n.Val)
		}
	} else {
		for i := len(level) - 1; i >= 0; i-- {
			result = append(result, level[i].Val)
		}
	}
	return result
}

func genNext(level []*TreeNode) []*TreeNode {
	var next []*TreeNode
	for _, v := range level {
		if v.Left != nil {
			next = append(next, v.Left)
		}
		if v.Right != nil {
			next = append(next, v.Right)
		}
	}
	return next
}