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

image.png

层次遍历

1思路是层次遍历了,只有需要设置一个flag 标签 来实现蛇形打印效果
2 实际上可以先分配数组长度值,如果是倒序的话 可以通过ans[l-i-1] 来设置值

  1. package main
  2. import "fmt"
  3. type TreeNode struct {
  4. Val int
  5. Left *TreeNode
  6. Right *TreeNode
  7. }
  8. func zigzagLevelOrder(root *TreeNode) [][]int {
  9. var res [][]int
  10. if root == nil {
  11. return res
  12. }
  13. queue := make([]*TreeNode, 0)
  14. queue = append(queue, root)
  15. isLeftStart := true
  16. for len(queue) > 0 {
  17. l := len(queue)
  18. ans := make([]int, l)
  19. for i := 0; i < l; i++ {
  20. node := queue[i]
  21. if node.Left != nil {
  22. queue = append(queue, node.Left)
  23. }
  24. if node.Right != nil {
  25. queue = append(queue, node.Right)
  26. }
  27. if isLeftStart {
  28. ans[i] = node.Val
  29. } else {
  30. ans[l-i-1] = node.Val
  31. }
  32. }
  33. res = append(res, ans)
  34. isLeftStart = !isLeftStart
  35. queue = queue[l:]
  36. }
  37. return res
  38. }
  39. func main() {
  40. three := &TreeNode{Val: 3}
  41. nine := &TreeNode{Val: 9}
  42. three.Left = nine
  43. twenty := &TreeNode{Val: 20}
  44. three.Right = twenty
  45. fifteen := &TreeNode{Val: 15}
  46. twenty.Left = fifteen
  47. seven := &TreeNode{Val: 7}
  48. twenty.Right = seven
  49. fmt.Println(zigzagLevelOrder(three))
  50. }