📑 题目:144. 二叉树的前序遍历

🚀 本题 LeetCode 传送门

题目大意

先根遍历一颗树。

解题思路

两种递归的实现方法,见代码。

代码

  1. package leetcode
  2. /**
  3. * Definition for a binary tree node.
  4. * type TreeNode struct {
  5. * Val int
  6. * Left *TreeNode
  7. * Right *TreeNode
  8. * }
  9. */
  10. // 解法一 递归
  11. func preorderTraversal(root *TreeNode) []int {
  12. res := []int{}
  13. if root != nil {
  14. res = append(res, root.Val)
  15. tmp := preorderTraversal(root.Left)
  16. for _, t := range tmp {
  17. res = append(res, t)
  18. }
  19. tmp = preorderTraversal(root.Right)
  20. for _, t := range tmp {
  21. res = append(res, t)
  22. }
  23. }
  24. return res
  25. }
  26. // 解法二 递归
  27. func preorderTraversal1(root *TreeNode) []int {
  28. var result []int
  29. preorder(root, &result)
  30. return result
  31. }
  32. func preorder(root *TreeNode, output *[]int) {
  33. if root != nil {
  34. *output = append(*output, root.Val)
  35. preorder(root.Left, output)
  36. preorder(root.Right, output)
  37. }
  38. }
  39. // 解法三 非递归,用栈模拟递归过程
  40. func preorderTraversal2(root *TreeNode) []int {
  41. if root == nil {
  42. return []int{}
  43. }
  44. stack, res := []*TreeNode{}, []int{}
  45. stack = append(stack, root)
  46. for len(stack) != 0 {
  47. node := stack[len(stack)-1]
  48. stack = stack[:len(stack)-1]
  49. if node != nil {
  50. res = append(res, node.Val)
  51. }
  52. if node.Right != nil {
  53. stack = append(stack, node.Right)
  54. }
  55. if node.Left != nil {
  56. stack = append(stack, node.Left)
  57. }
  58. }
  59. return res
  60. }