中序遍历是二叉树遍历的一种核心方式,指按照 左子树 → 根节点 → 右子树 的顺序访问树中所有节点。
为什么叫"中"序遍历?
因为根节点("中")是在左子树和右子树之间被访问的:
-
前序遍历:根 → 左 → 右
-
中序遍历:左 → 根 → 右
-
后序遍历:左 → 右 → 根
核心特点
-
遍历顺序:对每个子树都递归地执行「先访问左子树,再访问根节点,最后访问右子树」
-
二叉搜索树的特性:对二叉搜索树(BST)中序遍历会得到升序排列的节点值序列
示例说明
假设有以下二叉树:
5
/ \
3 7
/ \ \
1 4 9
中序遍历过程:
- 遍历节点5的左子树(以3为根)
- 遍历节点3的左子树(以1为根)
-
节点1无左子树 → 访问1
-
-
访问3
-
遍历节点3的右子树(以4为根)→ 访问4
- 遍历节点3的左子树(以1为根)
-
访问5
- 遍历节点5的右子树(以7为根)
-
访问7
-
遍历节点7的右子树(以9为根)→ 访问9
-
结果:1 → 3 → 4 → 5 → 7 → 9(升序)
实现方式
1. 递归实现(最直观)
def inorder_traversal(root):
if not root:
return
inorder_traversal(root.left) # 遍历左子树
print(root.val) # 访问根节点
inorder_traversal(root.right) # 遍历右子树
2. 非递归实现(栈)
def inorder_traversal(root):
stack = []
result = []
cur = root
while cur or stack:
# 一直向左走到最底层
while cur:
stack.append(cur)
cur = cur.left
# 访问节点并转向右子树
cur = stack.pop()
result.append(cur.val)
cur = cur.right
return result
复杂度分析
-
时间复杂度:O(n),每个节点访问一次
-
空间复杂度:O(h),h为树高(递归栈或显式栈的深度)
典型应用
-
二叉搜索树的排序输出
-
验证一棵树是否为二叉搜索树
-
表达式树的中缀表达式生成
关键点:中序遍历的"中"指根节点在中间被访问,这个特性使其在 BST 相关算法中尤为重要。
1137

被折叠的 条评论
为什么被折叠?



