前序中序后序遍历区别:对比表格与记忆口诀
对比表格:
| 遍历方式 | 访问顺序 | 举例 |
| | | |
| 前序遍历 | 根节点 -> 左子树 -> 右子树 | 先访问根节点,然后访问左子树,最后访问右子树 |
| 中序遍历 | 左子树 -> 根节点 -> 右子树 | 先访问左子树,然后访问根节点,最后访问右子树 |
| 后序遍历 | 左子树 -> 右子树 -> 根节点 | 先访问左子树,然后访问右子树,最后访问根节点 |
记忆口诀:
1. 前序遍历:首先老大(根节点)出来,然后老二(左子树)和老三(右子树)跟着。
2. 中序遍历:先让老二(左子树)出来,然后老大(根节点)出来,最后老三(右子树)出来。
3. 后序遍历:先让老二(左子树)和老三(右子树)出来,最后老大(根节点)出来。
这三种遍历方式在二叉树的算法中非常常见,它们被广泛应用于搜索、插入、删除等操作。在编程中,我们通常会使用递归或迭代的方式来实现这三种遍历。
递归实现:
python
前序遍历
def preorder_traversal(root):
if root:
print(root.val) 访问根节点
preorder_traversal(root.left) 递归遍历左子树
preorder_traversal(root.right) 递归遍历右子树
中序遍历
def inorder_traversal(root):
if root:
inorder_traversal(root.left) 递归遍历左子树
print(root.val) 访问根节点
inorder_traversal(root.right) 递归遍历右子树
后序遍历
def postorder_traversal(root):
if root:
postorder_traversal(root.left) 递归遍历左子树
postorder_traversal(root.right) 递归遍历右子树
print(root.val) 访问根节点
迭代实现(使用栈):
python
前序遍历
def preorder_traversal_iterative(root):
if not root:
return
stack, node = [root], root
while stack or node:
while node:
print(node.val) 访问根节点
stack.append(node)
node = node.left
node = stack.pop()
if node.right:
node = node.right
中序遍历
def inorder_traversal_iterative(root):
if not root:
return
stack = []
while root or stack:
while root:
stack.append(root)
root = root.left
node = stack.pop()
print(node.val) 访问根节点
root = node.right
后序遍历
def postorder_traversal_iterative(root):
if not root:
return
stack, output = [], []
node = root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
output.append(node.val) 先将节点值放入输出列表
if node.right:
node = node.right
else:
node = None
return output[::-1] 反转输出列表,得到后序遍历结果

