【剑指offer】按之字形顺序打印二叉树 [Go语言]

319 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

例如: 给定的二叉树是{1,2,3,#,#,4,5}

image.png

该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ]

示例1

输入:

{1,2,3,#,#,4,5}

返回值:

[[1],[3,2],[4,5]]

说明:

如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。    

示例2

输入:

{8,6,10,5,7,9,11}

返回值:

[[8],[10,6],[5,7,9,11]]

示例3

输入:

{1,2,3,4,5}

返回值:

[[1],[3,2],[4,5]]

这一题其实我们思路很简单,直接把进行层次遍历,然后把偶数层的进行反转即可。那么问题就是如何控制层数了。

func Print( pRoot *TreeNode ) [][]int {
    if pRoot == nil {
        return nil
    }
    var ans [][]int
(1)    queue := []*TreeNode{pRoot}
(2)    for len(queue)>0{
(3)        n := len(queue)
(4)        var a []int
(5)        for i:=0;i<n;i++{
(6)            curNode := queue[0]
(7)            queue = queue[1:]
(8)            a = append(a, curNode.Val)
(9)            if curNode.Right != nil{
(10)                queue = append(queue,curNode.Right)
            }
(11)            if curNode.Left != nil{
(12)                queue = append(queue,curNode.Left)
            }
        }
(13)        k1 := len(a)
(14)        k2 := len(ans)
(15)        if k2%2 != 1{
(16)            for j := 0 ; j < k1/2; j++ {
(17)                a[j], a[k1-j-1] = a[k1-j-1], a[j]
            }
        }
(18)        ans = append(ans,a)
    }
    return ans
}
  • (1) 定义一个队列去存储,进行节点的压入压出
  • (2) 如果这个队列的数大于0的话,就表示还在继续遍历这颗二叉树
  • (3) 定义n等于队列的大小,此时的队列大小就是,该层有多少个节点
  • (4) 定义存储该层数的数组
  • (5) 对该层的数据进行遍历
  • (6) 把队列头元素弹出
  • (7) 把队列向后移动
  • (8) 把这个弹出的值放到数组a中,表示第一层的元素,也就只有一个。
  • (9) 于是开始对该节点的右孩子进行判断
  • (10) 如果不是空就放入队列中
  • (11) 开始对该节点的左孩子进行判断
  • (12) 如果不是空就放入队列中
  • (13) 获取该层数组的个数
  • (14) 获取这是哪一层
  • (15) 如果这层是偶数层
  • (16) 进行交换
  • (17) 进行交换
  • (18) 合并到ans中