📑 题目:103. 二叉树的锯齿形层序遍历

🚀 本题 LeetCode 传送门

题目大意

按照 Z 字型层序遍历一棵树。

解题思路

  • 按层序从上到下遍历一颗树,但是每一层的顺序是相互反转的,即上一层是从左往右,下一层就是从右往左,以此类推。用一个队列即可实现。
  • 第 102 题和第 107 题都是按层序遍历的。

代码

  1. package leetcode
  2. import (
  3. ""github.com/halfrost/LeetCode-Go/structures""
  4. )
  5. // TreeNode define
  6. type TreeNode = structures.TreeNode
  7. /**
  8. * Definition for a binary tree node.
  9. * type TreeNode struct {
  10. * Val int
  11. * Left *TreeNode
  12. * Right *TreeNode
  13. * }
  14. */
  15. // 解法一
  16. func zigzagLevelOrder(root *TreeNode) [][]int {
  17. if root == nil {
  18. return [][]int{}
  19. }
  20. queue := []*TreeNode{}
  21. queue = append(queue, root)
  22. curNum, nextLevelNum, res, tmp, curDir := 1, 0, [][]int{}, []int{}, 0
  23. for len(queue) != 0 {
  24. if curNum > 0 {
  25. node := queue[0]
  26. if node.Left != nil {
  27. queue = append(queue, node.Left)
  28. nextLevelNum++
  29. }
  30. if node.Right != nil {
  31. queue = append(queue, node.Right)
  32. nextLevelNum++
  33. }
  34. curNum--
  35. tmp = append(tmp, node.Val)
  36. queue = queue[1:]
  37. }
  38. if curNum == 0 {
  39. if curDir == 1 {
  40. for i, j := 0, len(tmp)-1; i < j; i, j = i+1, j-1 {
  41. tmp[i], tmp[j] = tmp[j], tmp[i]
  42. }
  43. }
  44. res = append(res, tmp)
  45. curNum = nextLevelNum
  46. nextLevelNum = 0
  47. tmp = []int{}
  48. if curDir == 0 {
  49. curDir = 1
  50. } else {
  51. curDir = 0
  52. }
  53. }
  54. }
  55. return res
  56. }
  57. // 解法二 递归
  58. func zigzagLevelOrder0(root *TreeNode) [][]int {
  59. var res [][]int
  60. search(root, 0, &res)
  61. return res
  62. }
  63. func search(root *TreeNode, depth int, res *[][]int) {
  64. if root == nil {
  65. return
  66. }
  67. for len(*res) < depth+1 {
  68. *res = append(*res, []int{})
  69. }
  70. if depth%2 == 0 {
  71. (*res)[depth] = append((*res)[depth], root.Val)
  72. } else {
  73. (*res)[depth] = append([]int{root.Val}, (*res)[depth]...)
  74. }
  75. search(root.Left, depth+1, res)
  76. search(root.Right, depth+1, res)
  77. }
  78. // 解法三 BFS
  79. func zigzagLevelOrder1(root *TreeNode) [][]int {
  80. res := [][]int{}
  81. if root == nil {
  82. return res
  83. }
  84. q := []*TreeNode{root}
  85. size, i, j, lay, tmp, flag := 0, 0, 0, []int{}, []*TreeNode{}, false
  86. for len(q) > 0 {
  87. size = len(q)
  88. tmp = []*TreeNode{}
  89. lay = make([]int, size)
  90. j = size - 1
  91. for i = 0; i < size; i++ {
  92. root = q[0]
  93. q = q[1:]
  94. if !flag {
  95. lay[i] = root.Val
  96. } else {
  97. lay[j] = root.Val
  98. j--
  99. }
  100. if root.Left != nil {
  101. tmp = append(tmp, root.Left)
  102. }
  103. if root.Right != nil {
  104. tmp = append(tmp, root.Right)
  105. }
  106. }
  107. res = append(res, lay)
  108. flag = !flag
  109. q = tmp
  110. }
  111. return res
  112. }