【Golang】LeetCode-剑指Offer-面试题32 - III-从上到下打印二叉树 III

题目

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

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

提示:

节点总数 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof


解题思路

  • 本题是面试题32 - I-从上到下打印二叉树 的变化
  • 有题目可知在奇偶层数打印顺序相反
  • 所以在上一题代码的基础上,加上判断层数是奇或偶,从而确定节点数值是从左往右还是从右往左打印即可。

解法一:模拟队列

–执行用时:0 ms --内存消耗:3.3 MB

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func levelOrder(root *TreeNode) [][]int {
    if root==nil{
        return nil
    }
    var ret [][]int
    queue := []*TreeNode{root}
    //树顶视为第0层,从0开始
    level:=0
    for len(queue)!=0{
        temp := []*TreeNode{}
        ret = append(ret,make([]int,0))
        for _,v := range queue{
            if level & 1 ==0{
                //偶数层从左向右打印,数值追加至切片尾部
                ret[level]=append(ret[level],v.Val)
            }else{
                //奇数层从右向左打印,数值追加至切片头部
                s := []int{v.Val}
                ret[level]=append(s,ret[level]...)
            }
            //子树从左到右入队
            if v.Left!=nil{
                temp = append(temp,v.Left)
            }
            if v.Right!=nil{
                temp = append(temp,v.Right)
            }
        }
        //下一层
        queue = temp
        level++
    }
    return ret
}

解法二:递归

–执行用时:0 ms --内存消耗:3.3 MB

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var ret [][]int

func levelOrder(root *TreeNode) [][]int {
    ret=nil
    //树顶视为第0层,从0开始
    build(root,0)
    return ret
}

func build(root *TreeNode,level int){
    if root==nil{
        return
    }

    if level > len(ret)-1{
        ret=append(ret,make([]int,0))
    }

    if level & 1 == 0 {
        //偶数层从左向右打印,数值追加至切片尾部
        ret[level]=append(ret[level],root.Val)
    }else{
        //奇数层从右向左打印,数值追加至切片头部
        s:=[]int{root.Val}
        ret[level]=append(s,ret[level]...)
    }

    //下一层,从左到右递归子树
    level++
    build(root.Left,level)
    build(root.Right,level)
}

在LeetCode该题中,我也有提交题解,欢迎查看。昵称:Sakura。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值