写点什么

[Day35]-[二叉树]- 二叉树的锯齿形层序遍历

作者:方勇(gopher)
  • 2022 年 5 月 04 日
  • 本文字数:766 字

    阅读完需:约 3 分钟

103. 二叉树的锯齿形层序遍历

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

 

示例 1:


输入:root = [3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]
复制代码

示例 2:

输入:root = [1]输出:[[1]]
复制代码

示例 3:

输入:root = []输出:[]
复制代码


题解:

func TestZigzagLevelOrder(t *testing.T) {	var array = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}	var buildTree func(left, right int) *TreeNode	buildTree = func(left, right int) *TreeNode {		if left > right {			return nil		}		mid := (left + right) >> 1		root := &TreeNode{array[mid], nil, nil}		root.Left = buildTree(left, mid-1)		root.Right = buildTree(mid+1, right)
return root } root := buildTree(0, len(array)-1) // 初始化一颗二叉树
var bfs func(root *TreeNode) [][]int // 广度搜索 bfs = func(root *TreeNode) [][]int { var res = [][]int{} if root == nil { return res } queue := []*TreeNode{root} // 存放root节点的 数组 for level := 0; len(queue) > 0; level++ { // 层级遍历 q := queue queue = nil // 释放queue 或者用数组的裁剪弹出元素 vals := []int{} for _, r := range q { // 遍历 vals = append(vals, r.Val) if r.Left != nil { queue = append(queue, r.Left) } if r.Right != nil { queue = append(queue, r.Right) } } if level%2 == 1 { // 奇数的时候,反转数组 双指针 for i, n := 0, len(vals); i < n/2; i++ { vals[i], vals[n-1-i] = vals[n-1-i], vals[i] } } res = append(res, vals) }
return res }
t.Log(bfs(root))}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day35]-[二叉树]-二叉树的锯齿形层序遍历_方勇(gopher)_InfoQ写作社区