返回
二叉树的深度优先遍历
后端
2023-12-21 06:55:33
二叉树的深度优先遍历(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)
非递归实现
我们还可以使用栈来非递归地实现深度优先遍历。对于前序遍历,我们将根节点压入栈中,然后执行以下步骤,直到栈为空:
- 弹出栈顶元素并访问它。
- 将栈顶元素的右子树压入栈中。
- 将栈顶元素的左子树压入栈中。
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
对于中序遍历,我们将根节点压入栈中,然后执行以下步骤,直到栈为空:
- 弹出栈顶元素并访问它。
- 将栈顶元素的右子树压入栈中。
- 将栈顶元素的左子树压入栈中。
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
对于后序遍历,我们将根节点压入栈中,然后执行以下步骤,直到栈为空:
- 弹出栈顶元素并访问它。
- 将栈顶元素的右子树压入栈中。
- 将栈顶元素的左子树压入栈中。
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