剑指Offer32从上到下打印二叉树 III

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

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

    3
   / \
  9  20
    /  \
   15   7
复制代码

返回其层次遍历结果:

[
  [3],
  [20,9],
  [15,7]
]
复制代码

提示:

  1. 节点总数 <= 1000

二、思路分析

  1. 从上到下打印二叉树,使用广度优先遍历方法,创造一个队列q,不断将当前节点的子树加入队列中。
  2. 本题与从上到下打印二叉树不同的是,需要将奇数层的数值翻转后加入答案数组中。
  3. 加入一个num记录当前在奇数层还是偶数层,如果为奇数层则将当前数组内容翻转后加入答案的二维数组中。
  4. 队列遍历的条件是,q队列不为空,复制q队列内容为tmp队列,使q队列为空,遍历tmp队列,将节点的左右子节点再次加入q队列中,如果当前层为奇数层,翻转数组内容,加入答案数组中。

三、AC 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) (ans [][]int) {
    if root == nil {
        return [][]int{}
    }
    q := make([]*TreeNode,0)
    q = append(q,root)
    num := 0
    for q != nil {
        tmp := q
        q = nil 
        tmpres := make([]int,0)
        for i := 0 ;i<len(tmp);i++ {
            node := tmp[i]
            tmpres = append(tmpres,node.Val)
            if node.Left != nil {
                q = append(q,node.Left)
            }
            if node.Right != nil {
                q = append(q,node.Right)
            }
        }
        if num % 2 == 1 {
            ans = append(ans,reverse(tmpres))
        }else{
            ans = append(ans,tmpres)
        }
        num++
    }
    return 
}
func reverse(nums []int) []int{

    l,r := 0,len(nums)-1
    for ;l < r;l,r = l+1,r-1 {
        nums[l],nums[r] = nums[r],nums[l]
    }
    return nums
}
复制代码

四、总结

本题在从上到下遍历二叉树的基础上加入奇偶计数,将奇数层的数据翻转,附加一个翻转数组函数。

Supongo que te gusta

Origin juejin.im/post/7076737259617615909
Recomendado
Clasificación