二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

    image.png
    前序遍历
    基本思想:先访问当前结点,再前序遍历左子树,最后再前序遍历右子树即根—左—右
    图中前序遍历结果是:1,2,4,5,7,8,3,6
    中序遍历
    基本思想:先中序遍历左子树,然后再访问当前结点,最后再中序遍历右子树即左—根—右
    图中中序遍历结果是:4,2,7,8,5,1,3,6
    后序遍历
    基本思想:先后序遍历左子树,然后再后序遍历右子树,最后再访问当前结点即左—右—根
    图中后序遍历结果是:4,8,7,5,2,6,3,1
    层次遍历
    基本思想:从第一层开始,依此遍历每层,直到结束
    图中层次遍历结果是:1,2,3,4,5,6,7,8

    image.png

    1. package main
    2. import "fmt"
    3. //定义二叉树的节点
    4. type Node struct {
    5. value int
    6. left *Node
    7. right *Node
    8. }
    9. func (node *Node) Print() {
    10. fmt.Printf("%d ", node.value)
    11. }
    12. //功能:设置节点的值
    13. //参数:节点的值
    14. //返回值:nil
    15. func (node *Node) SetValue(value int) {
    16. node.value = value
    17. }
    18. //功能:创建节点
    19. //参数:节点的值
    20. //返回值:nil
    21. func CreateNode(value int) *Node {
    22. return &Node{value, nil, nil}
    23. }
    24. //功能:求树的高度,递归实现
    25. //参数:根节点
    26. //返回值:树的高度,树的高度=Max(左子树高度,右子树高度)+1
    27. func (node *Node) GetTreeHeigh() int {
    28. if node == nil {
    29. return 0
    30. } else {
    31. lHeigh := node.left.GetTreeHeigh()
    32. rHeigh := node.right.GetTreeHeigh()
    33. if lHeigh > rHeigh {
    34. return lHeigh + 1
    35. } else {
    36. return rHeigh + 1
    37. }
    38. }
    39. }
    40. //功能:求树的高度,通过遍历实现
    41. func (node *Node) GetTreeHeighByQueue() int {
    42. if node == nil {
    43. return 0
    44. }
    45. height := 0
    46. nodes := []*Node{node}
    47. for len(nodes) > 0 {
    48. height++
    49. size := len(nodes) // 每层的节点数
    50. count := 0
    51. for count < size { // 保证for循环执行完nodes都是不通层的数据
    52. count++
    53. currentNode := nodes[0]
    54. nodes = nodes[1:]
    55. if currentNode.left != nil {
    56. nodes = append(nodes, currentNode.left)
    57. }
    58. if currentNode.right != nil {
    59. nodes = append(nodes, currentNode.right)
    60. }
    61. }
    62. }
    63. return height
    64. }
    65. //前序遍历
    66. func (node *Node) PreOrder() {
    67. if node == nil {
    68. return
    69. }
    70. node.Print()
    71. node.left.PreOrder()
    72. node.right.PreOrder()
    73. }
    74. //中序遍历
    75. func (node *Node) MiddleOrder() {
    76. if node == nil {
    77. return
    78. }
    79. node.left.PostOrder()
    80. node.Print()
    81. node.right.PostOrder()
    82. }
    83. //后序遍历
    84. func (node *Node) PostOrder() {
    85. if node == nil {
    86. return
    87. }
    88. node.left.PostOrder()
    89. node.right.PostOrder()
    90. node.Print()
    91. }
    92. //层次遍历
    93. func (node *Node) BreadthFirstSearch() {
    94. if node == nil {
    95. return
    96. }
    97. res := []int{}
    98. nodes := []*Node{node}
    99. for len(nodes) > 0 {
    100. currentNode := nodes[0]
    101. res = append(res, currentNode.value)
    102. nodes = nodes[1:]
    103. if currentNode.left != nil {
    104. nodes = append(nodes, currentNode.left)
    105. }
    106. if currentNode.right != nil {
    107. nodes = append(nodes, currentNode.right)
    108. }
    109. }
    110. for _, v := range res {
    111. fmt.Print(v, " ")
    112. }
    113. }
    114. func main() {
    115. root := CreateNode(0)
    116. root.left = CreateNode(1)
    117. root.right = CreateNode(2)
    118. root.left.right = CreateNode(4)
    119. root.left.left = CreateNode(3)
    120. root.left.right.left = CreateNode(7)
    121. root.right.left = CreateNode(5)
    122. root.right.right = CreateNode(6)
    123. fmt.Println(root.GetTreeHeigh()) // 4
    124. fmt.Println(root.GetTreeHeighByQueue()) // 4
    125. root.PreOrder() // 0 1 3 4 7 2 5 6
    126. fmt.Println()
    127. root.MiddleOrder() // 3 7 4 1 0 5 6 2
    128. fmt.Println()
    129. root.PostOrder() // 3 7 4 1 5 6 2 0
    130. fmt.Println()
    131. root.BreadthFirstSearch() // 0 1 2 3 4 5 6 7
    132. }