二叉树中序遍历递归代码执行逻辑理解疑问
中序遍历递归代码的完整执行流程修正
你的梳理只覆盖了递归深入到最左子节点的部分,遗漏了递归回溯后的关键步骤——中序遍历的核心逻辑是「左子树遍历完成 → 处理当前节点 → 右子树遍历」,递归调用返回后会回到父节点的上下文继续执行后续代码。下面针对二叉树[5,8,7](根5,左子节点8,右子节点7),完整拆解执行流程:
首次调用
inorderTraversal(root=5, result=None)- 因为
result为None,创建空列表result = [] - root不为空,执行左子树调用:
self.inorderTraversal(root.left=8, result=[])
- 因为
第二次调用
inorderTraversal(root=8, result=[])result已存在,跳过初始化- root不为空,执行左子树调用:
self.inorderTraversal(root.left=None, result=[])
第三次调用
inorderTraversal(root=None, result=[])- root为空,直接返回
result(此时为空列表)
- root为空,直接返回
以下是你之前遗漏的回溯流程:
回到第二次调用(root=8)的上下文
- 左子树遍历完成,执行
result.append(8),此时result = [8] - 接着执行右子树调用:
self.inorderTraversal(root.right=None, result=[8])
- 左子树遍历完成,执行
第四次调用
inorderTraversal(root=None, result=[8])- root为空,返回
result(仍为[8])
- root为空,返回
回到首次调用(root=5)的上下文
- 左子树遍历完成,执行
result.append(5),此时result = [8,5] - 接着执行右子树调用:
self.inorderTraversal(root.right=7, result=[8,5])
- 左子树遍历完成,执行
第五次调用
inorderTraversal(root=7, result=[8,5])result已存在,跳过初始化- root不为空,执行左子树调用:
self.inorderTraversal(root.left=None, result=[8,5])
第六次调用
inorderTraversal(root=None, result=[8,5])- root为空,返回
result
- root为空,返回
回到第五次调用(root=7)的上下文
- 左子树遍历完成,执行
result.append(7),此时result = [8,5,7] - 接着执行右子树调用:
self.inorderTraversal(root.right=None, result=[8,5,7])
- 左子树遍历完成,执行
第七次调用
inorderTraversal(root=None, result=[8,5,7])- root为空,返回
result
- root为空,返回
回到首次调用(root=5)的上下文
- 右子树遍历完成,返回最终结果
[8,5,7]
- 右子树遍历完成,返回最终结果
你的核心误区
你只追踪了递归「向下深入」的过程,没考虑到递归调用返回后,会回到父节点的代码中继续执行当前节点值的添加和右子树的遍历,这才是中序遍历「左-根-右」逻辑的完整实现。
内容的提问来源于stack exchange,提问作者user1190361
相关产品推荐
相关产品推荐

