94. 二叉树的中序遍历

image.png

image.png

  1. package main
  2. type TreeNode struct {
  3. Val int
  4. Left *TreeNode
  5. Right *TreeNode
  6. }
  7. // 左中右
  8. func inorderTraversal(root *TreeNode) []int {
  9. var l []int
  10. //如果是空直接返回
  11. if root == nil {
  12. return nil
  13. }
  14. // 创建栈 递归从根源就是栈结构
  15. stack := make([]*TreeNode, 0)
  16. node := root
  17. // 只要当前节点不为空,或者栈不为空,就一直循环查找左节点
  18. for node != nil || len(stack) > 0 {
  19. //查找左节点
  20. if node != nil {
  21. // 将左节点放入栈中
  22. stack = append(stack, node)
  23. node = node.Left
  24. } else {
  25. // 获取站顶节点
  26. curr := stack[len(stack)-1]
  27. // 出栈操作
  28. stack = stack[:len(stack)-1]
  29. l = append(l, curr.Val)
  30. // 遍历右节点
  31. node = curr.Right
  32. }
  33. }
  34. return l
  35. }
  36. func main() {
  37. a := &TreeNode{
  38. Val: 1,
  39. }
  40. b := &TreeNode{
  41. Val: 2,
  42. }
  43. a.Left = b
  44. c := &TreeNode{
  45. Val: 3,
  46. }
  47. a.Right = c
  48. d := &TreeNode{
  49. Val: 4,
  50. }
  51. b.Left = d
  52. e := &TreeNode{
  53. Val: 5,
  54. }
  55. b.Right = e
  56. f := &TreeNode{
  57. Val: 6,
  58. }
  59. c.Left = f
  60. // 4,2,5,1,6,3
  61. inorderTraversal(a)
  62. }

Java代码实现

  1. public class Solution {
  2. public List < Integer > inorderTraversal(TreeNode root) {
  3. List < Integer > res = new ArrayList < > ();
  4. Stack < TreeNode > stack = new Stack < > ();
  5. TreeNode curr = root;
  6. while (curr != null || !stack.isEmpty()) {
  7. while (curr != null) {
  8. stack.push(curr);
  9. curr = curr.left;
  10. }
  11. curr = stack.pop();
  12. res.add(curr.val);
  13. curr = curr.right;
  14. }
  15. return res;
  16. }
  17. }

144. 二叉树的前序遍历

image.png
首先我们应该创建一个Stack用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入Stack,然后打印。
之后我们应该先打印左子树,然后右子树。所以先加入Stack的就是右子树,然后左子树。

image.png

  1. import java.util.LinkedList;
  2. import java.util.List;
  3. class TreeNode {
  4. int val;
  5. TreeNode left;
  6. TreeNode right;
  7. TreeNode(int x) {
  8. val = x;
  9. };
  10. }
  11. public class binary_tree_preorder_traversal_144 {
  12. public static List<Integer> preorderTraversal(TreeNode root) {
  13. LinkedList<TreeNode> stack = new LinkedList<>();
  14. LinkedList<Integer> output = new LinkedList<>();
  15. if (root == null) {
  16. return output;
  17. }
  18. stack.add(root);
  19. while (!stack.isEmpty()) {
  20. TreeNode node = stack.pollLast();
  21. output.add(node.val);
  22. if (node.right != null) {
  23. stack.add(node.right);
  24. }
  25. if (node.left != null) {
  26. stack.add(node.left);
  27. }
  28. }
  29. return output;
  30. }
  31. public static void main(String[] args) {
  32. TreeNode one = new TreeNode(1);
  33. TreeNode two = new TreeNode(2);
  34. TreeNode three = new TreeNode(3);
  35. one.right = two;
  36. two.left = three;
  37. List<Integer> r = preorderTraversal(one);
  38. System.out.println(r);
  39. }
  40. }

go 实现

  1. package main
  2. import "fmt"
  3. // 前序遍历
  4. type TreeNode struct {
  5. Val int
  6. Left *TreeNode
  7. Right *TreeNode
  8. }
  9. // 递归方法
  10. func preorderTraversal(root *TreeNode) []int{
  11. if root==nil {
  12. return nil
  13. }
  14. fmt.Println(root.Val)
  15. preorderTraversal1(root.Left)
  16. preorderTraversal1(root.Right)
  17. return nil
  18. }
  19. // 中左右
  20. func preorderTraversal1(root *TreeNode) []int {
  21. var l []int
  22. //如果是空直接返回
  23. if root == nil {
  24. return nil
  25. }
  26. // 创建栈 递归从根源就是栈结构
  27. stack := make([]*TreeNode, 0)
  28. curr := root
  29. // 只要当前节点不为空,或者栈不为空,就一直循环查找左节点
  30. for curr != nil || len(stack) > 0 {
  31. //查找左节点
  32. for (curr != nil){
  33. stack = append(stack,curr)
  34. fmt.Println(curr.Val)
  35. l = append(l,curr.Val)
  36. curr = curr.Left
  37. }
  38. curr = stack[len(stack)-1]
  39. stack = stack[:len(stack)-1]
  40. curr = curr.Right
  41. }
  42. return l
  43. }
  44. // 中左右
  45. func preorderTraversal2(root *TreeNode) []int {
  46. var l []int
  47. //如果是空直接返回
  48. if root == nil {
  49. return nil
  50. }
  51. // 创建栈 递归从根源就是栈结构
  52. stack := make([]*TreeNode, 0)
  53. stack = append(stack,root)
  54. // 只要当前节点不为空,或者栈不为空,就一直循环查找左节点
  55. for len(stack) > 0 {
  56. curr := stack[len(stack)-1]
  57. stack = stack[:len(stack)-1]
  58. fmt.Println(curr.Val)
  59. l = append(l,curr.Val)
  60. if curr.Right != nil {
  61. stack = append(stack,curr.Right)
  62. }
  63. if curr.Left != nil {
  64. stack = append(stack,curr.Left)
  65. }
  66. }
  67. return l
  68. }
  69. //https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
  70. func main() {
  71. a := &TreeNode{
  72. Val: 1,
  73. }
  74. b := &TreeNode{
  75. Val: 2,
  76. }
  77. a.Left = b
  78. c := &TreeNode{
  79. Val: 3,
  80. }
  81. a.Right = c
  82. d := &TreeNode{
  83. Val: 4,
  84. }
  85. b.Left = d
  86. e := &TreeNode{
  87. Val: 5,
  88. }
  89. b.Right = e
  90. f := &TreeNode{
  91. Val: 6,
  92. }
  93. c.Left = f
  94. // 1 2 4 5 3 6
  95. preorderTraversal1(a)
  96. }