返回

前中后序遍历的几种写法与剖析

前端

前序遍历

前序遍历的顺序是:根结点 -> 左子树 -> 右子树。

前序遍历的递归写法

def preorder_traversal_recursive(root):
  if root is None:
    return

  # 访问根结点
  print(root.data)

  # 递归遍历左子树
  preorder_traversal_recursive(root.left)

  # 递归遍历右子树
  preorder_traversal_recursive(root.right)

前序遍历的非递归写法

def preorder_traversal_iterative(root):
  stack = []

  while root or stack:
    # 如果根结点不为空,则将其压入栈中
    while root:
      # 访问根结点
      print(root.data)

      # 将根结点压入栈中
      stack.append(root)

      # 将根结点的左子树作为新的根结点
      root = root.left

    # 如果根结点为空,则从栈中弹出顶层结点作为新的根结点
    root = stack.pop()

    # 将根结点的右子树作为新的根结点
    root = root.right

中序遍历

中序遍历的顺序是:左子树 -> 根结点 -> 右子树。

中序遍历的递归写法

def inorder_traversal_recursive(root):
  if root is None:
    return

  # 递归遍历左子树
  inorder_traversal_recursive(root.left)

  # 访问根结点
  print(root.data)

  # 递归遍历右子树
  inorder_traversal_recursive(root.right)

中序遍历的非递归写法

def inorder_traversal_iterative(root):
  stack = []

  while root or stack:
    # 如果根结点不为空,则将其压入栈中
    while root:
      # 将根结点压入栈中
      stack.append(root)

      # 将根结点的左子树作为新的根结点
      root = root.left

    # 如果根结点为空,则从栈中弹出顶层结点作为新的根结点
    root = stack.pop()

    # 访问根结点
    print(root.data)

    # 将根结点的右子树作为新的根结点
    root = root.right

后序遍历

后序遍历的顺序是:左子树 -> 右子树 -> 根结点。

后续遍历的递归写法

def postorder_traversal_recursive(root):
  if root is None:
    return

  # 递归遍历左子树
  postorder_traversal_recursive(root.left)

  # 递归遍历右子树
  postorder_traversal_recursive(root.right)

  # 访问根结点
  print(root.data)

后序遍历的非递归写法

def postorder_traversal_iterative(root):
  stack = []

  while root or stack:
    # 如果根结点不为空,则将其压入栈中
    while root:
      # 将根结点压入栈中
      stack.append(root)

      # 将根结点的右子树作为新的根结点
      root = root.right

      # 将根结点的左子树作为新的根结点
      root = root.left

    # 如果根结点为空,则从栈中弹出顶层结点作为新的根结点
    root = stack.pop()

    # 访问根结点
    print(root.data)

总结

前序遍历、中序遍历和后序遍历是三种常见的二叉树遍历方式,每种遍历方式都有其独特的特点和应用场景。通过本文的介绍,希望读者能够对这三种遍历方式有更深入的了解,并能够根据需要选择合适的遍历方式。