返回

二叉树的深度优先遍历

后端

二叉树的深度优先遍历(DFS)是一种遍历二叉树的方法,其中我们从根节点开始,然后沿着每个分支一直向下,直到到达叶子节点。然后,我们回溯并访问下一个分支。

DFS 有两种主要类型:前序遍历、中序遍历和后序遍历。

  • 前序遍历 :根、左、右。
  • 中序遍历 :左、根、右。
  • 后序遍历 :左、右、根。

递归实现

使用递归实现深度优先遍历非常简单。对于前序遍历,我们首先访问根节点,然后递归遍历左子树,最后递归遍历右子树。

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

    # 访问根节点
    print(root.val)

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

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

对于中序遍历,我们首先递归遍历左子树,然后访问根节点,最后递归遍历右子树。

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

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

    # 访问根节点
    print(root.val)

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

对于后序遍历,我们首先递归遍历左子树,然后递归遍历右子树,最后访问根节点。

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

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

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

    # 访问根节点
    print(root.val)

非递归实现

我们还可以使用栈来非递归地实现深度优先遍历。对于前序遍历,我们将根节点压入栈中,然后执行以下步骤,直到栈为空:

  1. 弹出栈顶元素并访问它。
  2. 将栈顶元素的右子树压入栈中。
  3. 将栈顶元素的左子树压入栈中。
def preorder_traversal_iterative(root):
    stack = []
    while root or stack:
        # 访问根节点
        if root:
            print(root.val)
            stack.append(root)
            root = root.left
        else:
            # 弹出栈顶元素
            root = stack.pop()
            # 访问右子树
            root = root.right

对于中序遍历,我们将根节点压入栈中,然后执行以下步骤,直到栈为空:

  1. 弹出栈顶元素并访问它。
  2. 将栈顶元素的右子树压入栈中。
  3. 将栈顶元素的左子树压入栈中。
def inorder_traversal_iterative(root):
    stack = []
    while root or stack:
        # 访问根节点
        if root:
            stack.append(root)
            root = root.left
        else:
            # 弹出栈顶元素
            root = stack.pop()
            print(root.val)
            # 访问右子树
            root = root.right

对于后序遍历,我们将根节点压入栈中,然后执行以下步骤,直到栈为空:

  1. 弹出栈顶元素并访问它。
  2. 将栈顶元素的右子树压入栈中。
  3. 将栈顶元素的左子树压入栈中。
def postorder_traversal_iterative(root):
    stack = []
    while root or stack:
        # 访问根节点
        if root:
            stack.append(root)
            root = root.right
        else:
            # 弹出栈顶元素
            root = stack.pop()
            print(root.val)
            # 访问左子树
            root = root.left