深度优先遍历(DFS):
    核心思想就是 “一条路走道黑”,从一个位置,一般是二叉树的顶点开始,一直向下走,走道不能走了之后 回到上一个节点,看能否还有其他的路 (回溯法),直到遍历完成

    实现:递归方法 和 非递归方法

    递归方法:(比较简单,但是深度较深的时候,会导致内存溢出)

    1. //递归的核心就是dfs函数,拿前序遍历来说 根——左——右 循环调用递归调用dfs函数
    2. func dfs(root *TreeNode,res [] int){
    3. if root == nil {
    4. return
    5. }
    6. res = append(res,root.value)
    7. dfs(root.left,res)
    8. dfs(root.right,res)
    9. }

    非递归方法:

    1. //非递归的方法,是用栈实现 由于栈是'先进后出'的顺序 也是拿前序遍历来说
    2. //1.初始化栈,并将根节点入栈,当栈不为空的时候,弹栈入结果集
    3. //2.右子树加入栈
    4. //3.左子树加入栈
    5. func dfs(root *TreeNode) []int{
    6. stack := []TreeNode{}
    7. res := []int
    8. if root == nil {
    9. return res
    10. }
    11. stack = append(stack,root)
    12. for len(stack)!= 0 {
    13. node := stack[len(stack)-1]
    14. stack = stack[:len(stack)-1]
    15. if node!=nil {
    16. res = append(res,node.value)
    17. if node.right != nil {
    18. stack = append(stack,node.right)
    19. }
    20. if node.left != nil {
    21. stack = append(stack,node.left)
    22. }
    23. }
    24. }
    25. return res
    26. }
    27. //模板化的前中后序遍历, 套路是 第一步永远是将左子树都放到栈里,之后弹出之后再计算右子树,根据前中后顺序不同选择不同的位置放入结果集
    28. //前序
    29. func dfs(root *TreeNode) []int {
    30. stack := []*TreeNode{}
    31. res := []int
    32. if root == nil {
    33. return res
    34. }
    35. for len(stack) != 0 {
    36. for root != nil {
    37. res = append(res, root.Val)
    38. stack = append(stack, root)
    39. root = root.Left
    40. }
    41. root = stack[len(stack)-1]
    42. stack = stack[:len(stack)-1]
    43. root = root.Right
    44. }
    45. return
    46. }
    47. //中序
    48. func dfs(root *TreeNode) []int {
    49. stack := []*TreeNode{}
    50. res := []int
    51. if root == nil {
    52. return res
    53. }
    54. for len(stack) != 0 {
    55. for root != nil {
    56. stack = append(stack, root)
    57. root = root.Left
    58. }
    59. root = stack[len(stack)-1]
    60. stack = stack[:len(stack)-1]
    61. res = append(res, root.Val)
    62. root = root.Right
    63. }
    64. return res
    65. }
    66. //后序
    67. func dfs(root *TreeNode) []int {
    68. stack := []*TreeNode{}
    69. var prev *TreeNode
    70. res := []int
    71. if root == nil {
    72. return res
    73. }
    74. for len(stack) != 0 {
    75. for root != nil {
    76. stack = append(stack, root)
    77. root = root.Left
    78. }
    79. root = stack[len(stack)-1]
    80. stack = stack[:len(stack)-1]
    81. if root.Right == nil || root.Right == prev {
    82. res = append(res, root.Val)
    83. prev = root
    84. root = nil
    85. } else {
    86. stk = append(stk, root)
    87. root = root.Right
    88. }
    89. }
    90. return res
    91. }

    深度优先遍历(DFS):
    核心思想就是分层次遍历,用队列存储树的每一层,这样遍历这个队列,安层次输出到二维数据中去

    1. func bfs(root *TreeNode) [][]int {
    2. ret := [][]int{}
    3. if root == nil {
    4. return ret
    5. }
    6. q := []*TreeNode{root}
    7. for i := 0; len(q) > 0; i++ {
    8. ret = append(ret, []int{})
    9. p := []*TreeNode{}
    10. for j := 0; j < len(q); j++ {
    11. node := q[j]
    12. ret[i] = append(ret[i], node.Val)
    13. if node.Left != nil {
    14. p = append(p, node.Left)
    15. }
    16. if node.Right != nil {
    17. p = append(p, node.Right)
    18. }
    19. }
    20. q = p
    21. }
    22. return ret
    23. }