image.png
递归实现

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历
  4. 层序遍历

    层序遍历: 按照二叉树中的层次从左到右依次遍历每层中的结点 借助队列先进先出的特性,从树的根结点开始,依次将其左子节点和右子节点入队。 而后每次队列中一个结点出队,都将其左子节点和右子节点入队,直到树中所有结点都出队, 出队结点的先后顺序就是层次遍历的最终结果

代码

  1. // 二叉树
  2. package main
  3. import "fmt"
  4. type Hero struct {
  5. No int
  6. Name string
  7. Left *Hero // 指向左边节点的指针
  8. Right *Hero // 指向右边节点的指针
  9. }
  10. // 前序遍历 - 先输出根节点,然后输出左子树,最后输出右子树
  11. func PreOrder(node *Hero) {
  12. if node != nil {
  13. // 递归调用,先根再左后右
  14. fmt.Printf("No=%v, Name=%v \n", node.No, node.Name)
  15. PreOrder(node.Left)
  16. PreOrder(node.Right)
  17. }
  18. }
  19. // 中序遍历 - 先输出左子树,然后输出根节点,最后输出右子树
  20. func InfixOrder(node *Hero) {
  21. if node != nil {
  22. // 递归调用,先左再根后右
  23. InfixOrder(node.Left)
  24. fmt.Printf("No=%v, Name=%v \n", node.No, node.Name)
  25. InfixOrder(node.Right)
  26. }
  27. }
  28. // 后序遍历 - 先输出左子树,然后输出右子树,最后输出根节点
  29. func PostOrder(node *Hero) {
  30. if node != nil {
  31. // 递归调用,先左再右后根
  32. PostOrder(node.Left)
  33. PostOrder(node.Right)
  34. fmt.Printf("No=%v, Name=%v \n", node.No, node.Name)
  35. }
  36. }
  37. /*
  38. 层序遍历:
  39. 借助队列先进先出的特性,从树的根结点开始,依次将其左子节点和右子节点入队。
  40. 而后每次队列中一个结点出队,都将其左子节点和右子节点入队,直到树中所有结点都出队,
  41. 出队结点的先后顺序就是层次遍历的最终结果
  42. */
  43. func levelOrder(node *Hero) [][]int {
  44. ret := [][]int{} // 定义一个存放遍历之后的数组
  45. fmt.Printf("res类型: %T \n", ret)
  46. if node == nil {
  47. return ret
  48. }
  49. q := []*Hero{node} // 将整颗树怼进队列里
  50. for i := 0; len(q) > 0; i++ {
  51. ret = append(ret, []int{})
  52. p := []*Hero{}
  53. for j := 0; j < len(q); j++ {
  54. node := q[j]
  55. ret[i] = append(ret[i], node.No)
  56. if node.Left != nil {
  57. p = append(p, node.Left)
  58. }
  59. if node.Right != nil {
  60. p = append(p, node.Right)
  61. }
  62. }
  63. q = p
  64. }
  65. return ret
  66. }
  67. func main() {
  68. // 构建二叉树
  69. root := &Hero{
  70. No: 1,
  71. Name: "xixi",
  72. }
  73. left1 := &Hero{
  74. No: 2,
  75. Name: "haha",
  76. }
  77. left2 := &Hero{
  78. No: 10,
  79. Name: "1010",
  80. }
  81. right02 := &Hero{
  82. No: 11,
  83. Name: "1111",
  84. }
  85. right1 := &Hero{
  86. No: 3,
  87. Name: "hehe",
  88. }
  89. right2 := &Hero{
  90. No: 4,
  91. Name: "heihei",
  92. }
  93. right5 := &Hero{
  94. No: 5,
  95. Name: "5555",
  96. }
  97. root.Left = left1
  98. root.Right = right1
  99. right1.Right = right2
  100. left1.Left = left2
  101. left1.Right = right02
  102. right1.Left = right5
  103. fmt.Println("前序遍历---")
  104. // 前序遍历
  105. PreOrder(root)
  106. fmt.Println("中序遍历---")
  107. // 中序遍历
  108. InfixOrder(root)
  109. // 后续遍历
  110. fmt.Println("后续遍历---")
  111. PostOrder(root)
  112. fmt.Println("层序遍历---")
  113. arr := levelOrder(root)
  114. fmt.Println("arr = ", arr)
  115. }
  116. // 前序遍历
  117. /*
  118. No=1, Name=xixi
  119. No=2, Name=haha
  120. No=10, Name=1010
  121. No=11, Name=1111
  122. No=3, Name=hehe
  123. No=5, Name=5555
  124. No=4, Name=heihei
  125. */
  126. // 中序遍历
  127. /*
  128. No=10, Name=1010
  129. No=2, Name=haha
  130. No=11, Name=1111
  131. No=1, Name=xixi
  132. No=5, Name=5555
  133. No=3, Name=hehe
  134. No=4, Name=heihei
  135. */
  136. // 后序遍历
  137. /*
  138. No=10, Name=1010
  139. No=11, Name=1111
  140. No=2, Name=haha
  141. No=5, Name=5555
  142. No=4, Name=heihei
  143. No=3, Name=hehe
  144. No=1, Name=xixi
  145. */
  146. // 层序遍历---
  147. /* res类型: [][]int
  148. arr = [[1] [2 3] [10 11 5 4]] */