返回
二叉树的 DFS 迭代遍历:揭秘栈的奥秘
见解分享
2023-10-31 04:38:31
二叉树作为一种重要的数据结构,在计算机科学中广泛应用。我们熟知的 DFS 遍历(深度优先搜索)采用递归的方式实现。然而,当我们想要使用迭代法遍历二叉树时,栈便成了不可或缺的工具。
栈是一种先进后出的数据结构,它巧妙地模拟了递归的执行过程。我们把二叉树的结点压入栈中,按照特定的顺序出栈并处理,就能实现 DFS 的遍历。
前序遍历
前序遍历的顺序是:根结点 -> 左子树 -> 右子树。在迭代过程中,我们首先把根结点压入栈中,然后依次取出栈顶元素并处理。如果该元素有左子树,则把左子树压入栈中;若有右子树,则把右子树压入栈中。以此类推,直到栈为空。
def dfs_preorder(root):
stack = [root]
while stack:
node = stack.pop()
# 处理 node
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
中序遍历
中序遍历的顺序是:左子树 -> 根结点 -> 右子树。它的迭代过程与前序遍历类似,但出栈顺序有所不同。当我们取出栈顶元素并处理后,我们先把它的右子树压入栈中,再把它的左子树压入栈中。这样就能保证中序遍历的顺序。
def dfs_inorder(root):
stack = [root]
while stack:
node = stack.pop()
# 处理 node
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
后序遍历
后序遍历的顺序是:左子树 -> 右子树 -> 根结点。它的迭代过程与前序遍历和中序遍历都有所不同。我们首先把根结点压入栈中,然后依次取出栈顶元素并处理。如果该元素有左子树,则把左子树压入栈中;若有右子树,则把右子树压入栈中。但这一次,我们不会立即处理该元素,而是把它再次压入栈中。这样,当我们再次取出该元素时,它就位于栈顶,可以被处理了。
def dfs_postorder(root):
stack = [root]
while stack:
node = stack.pop()
if node in stack:
stack.append(node)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
else:
# 处理 node
pass
结语
二叉树的 DFS 迭代遍历充分展现了栈在计算机科学中的强大作用。通过模拟递归的执行过程,栈可以帮助我们以迭代的方式高效地遍历二叉树。掌握 DFS 迭代遍历的技巧,将使您在处理二叉树相关问题时更加游刃有余。