Python面试题:如何在 Python 中实现二叉树的遍历?
·
在 Python 中实现二叉树的遍历,可以采用以下几种常见的方法:
- 前序遍历(Preorder Traversal)
- 中序遍历(Inorder Traversal)
- 后序遍历(Postorder Traversal)
- 层次遍历(Level Order Traversal)
下面将详细介绍如何实现这些遍历方法。
一、定义二叉树节点类
首先,我们需要定义一个二叉树节点类 TreeNode:
class TreeNode:
def __init__(self, value=0, left=None, right=None):
self.value = value
self.left = left
self.right = right
二、前序遍历(Preorder Traversal)
前序遍历的顺序是:根节点 -> 左子树 -> 右子树。
1. 递归实现
def preorder_traversal_recursive(root):
if root is None:
return []
return [root.value] + preorder_traversal_recursive(root.left) + preorder_traversal_recursive(root.right)
2. 迭代实现
def preorder_traversal_iterative(root):
if root is None:
return []
stack, output = [root], []
while stack:
node = stack.pop()
if node:
output.append(node.value)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return output
三、中序遍历(Inorder Traversal)
中序遍历的顺序是:左子树 -> 根节点 -> 右子树。
1. 递归实现
def inorder_traversal_recursive(root):
if root is None:
return []
return inorder_traversal_recursive(root.left) + [root.value] + inorder_traversal_recursive(root.right)
2. 迭代实现
def inorder_traversal_iterative(root):
stack, output = [], []
current = root
while stack or current:
while current:
stack.append(current)
current = current.left
current = stack.pop()
output.append(current.value)
current = current.right
return output
四、后序遍历(Postorder Traversal)
后序遍历的顺序是:左子树 -> 右子树 -> 根节点。
1. 递归实现
def postorder_traversal_recursive(root):
if root is None:
return []
return postorder_traversal_recursive(root.left) + postorder_traversal_recursive(root.right) + [root.value]
2. 迭代实现
def postorder_traversal_iterative(root):
if root is None:
return []
stack, output = [root], []
while stack:
node = stack.pop()
if node:
output.append(node.value)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return output[::-1] # Reverse the process to get the correct order
五、层次遍历(Level Order Traversal)
层次遍历的顺序是:按层次从上到下,从左到右遍历。
迭代实现
from collections import deque
def level_order_traversal(root):
if root is None:
return []
queue, output = deque([root]), []
while queue:
node = queue.popleft()
output.append(node.value)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return output
六、示例
最后,提供一个示例二叉树,并展示所有遍历方法的使用:
# 构建示例二叉树
# 1
# / \
# 2 3
# / \ / \
# 4 5 6 7
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
# 前序遍历
print("Preorder Traversal (Recursive):", preorder_traversal_recursive(root))
print("Preorder Traversal (Iterative):", preorder_traversal_iterative(root))
# 中序遍历
print("Inorder Traversal (Recursive):", inorder_traversal_recursive(root))
print("Inorder Traversal (Iterative):", inorder_traversal_iterative(root))
# 后序遍历
print("Postorder Traversal (Recursive):", postorder_traversal_recursive(root))
print("Postorder Traversal (Iterative):", postorder_traversal_iterative(root))
# 层次遍历
print("Level Order Traversal:", level_order_traversal(root))
运行上述代码,可以得到各类遍历的结果。通过这些遍历方法,你可以更好地理解和操作二叉树结构。
更多推荐
所有评论(0)