题目描述#

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

思路#

在 102 题层序遍历的基础上加一个方向判断。用 height 记录当前层数(从 0 开始),偶数层从左往右正常追加,奇数层从右往左,只需在每层处理完后判断 height%2 == 1,对结果翻转即可。

翻转使用标准库 slices.Reverse,只作用于当前层的切片,不影响其他层。

根节点为空时直接返回空数组,不进入循环。

代码#

import "slices"

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func zigzagLevelOrder(root *TreeNode) (ans [][]int) {
    // 0. root 为nil
    if root == nil {
        return [][]int{}
    }
    // 1. 使用队列保存每一行的数据
    queue := []*TreeNode{root}
    height := 0 // height表示二叉树的层数
    for len(queue) > 0 {
        queueSize := len(queue)
        ans = append(ans, []int{})
        // 2. 使用正常的层序遍历
        for i := 0; i < queueSize; i++ {
            node := queue[0]
            queue = queue[1:]
            ans[height] = append(ans[height], node.Val)
            if node.Left != nil {
                queue = append(queue, node.Left)
            }
            if node.Right != nil {
                queue = append(queue, node.Right)
            }
        }
        // 3. 如果当前为奇数层,我们需要翻转当前的层数ans即可
        if height%2 == 1 {
            slices.Reverse(ans[height])
        }
        height++
    }
    return
}
本站总访问量  ·  访客数
你的IP 获取中…