You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二叉搜索树中序遍历递归代码执行逻辑疑惑求助

理解二叉搜索树中序遍历的递归执行流程

你困惑的核心是递归调用栈的“回溯”机制——当一个递归函数执行完毕后,程序会回到它被调用的位置,继续执行后续未完成的代码。我们结合你的BST结构、代码和输出日志,一步步拆解整个执行过程,就能清楚看到为什么处理完node=3后会回到node=4。

首先明确你的BST结构:

9
   / \
  4  17
 / \
3   6

递归调用栈的基本逻辑

每次调用io(node)时,当前函数的执行状态(比如刚执行到哪一行代码)会被“压入”调用栈保存;当这个io(node)函数执行完毕(走到函数末尾或遇到return),栈顶的状态会被“弹出”,程序回到上一次调用io(node)的位置,继续执行剩下的代码。

结合你的代码和输出一步步分析

我们按日志顺序拆解:

  1. 初始调用io(9):

    • 打印restart、b4 app 9
    • 发现node.left(即节点4)存在,调用io(4)
    • 此时io(9)的执行被暂停,它的状态被压入调用栈
  2. 进入io(4):

    • 打印restart、b4 app 4(对应你日志里的[3])
    • 发现node.left(即节点3)存在,调用io(3)
    • io(4)的执行被暂停,状态压入调用栈
  3. 进入io(3):

    • 打印restart、b4 app 3
    • 检查node.left:节点3没有左子节点,跳过左递归
    • 执行result.append(3),把3加入结果列表
    • 打印aft app 3 True(因为节点3的right是None)
    • 检查node.right:是None,跳过右递归
    • io(3)执行完毕,从调用栈中弹出
  4. 回溯到io(4):

    • 程序回到io(4)中调用io(3)的那一行之后的位置
    • 执行result.append(4),把4加入结果列表
    • 打印aft app 4 False(因为节点4的right是6,不是None)
    • 检查node.right:节点6存在,打印inside right,调用io(6)
    • io(4)再次暂停,状态压入调用栈
  5. 进入io(6):

    • 打印restart、b4 app 6
    • 检查左子节点:不存在,跳过左递归
    • 执行result.append(6),把6加入结果列表
    • 打印aft app 6 True(节点6的right是None)
    • 检查右子节点:不存在,跳过右递归
    • io(6)执行完毕,从调用栈弹出
  6. 再次回溯到io(4):

    • io(6)执行完后,io(4)的所有代码都执行完毕,从调用栈弹出
  7. 回溯到io(9):

    • 程序回到io(9)中调用io(4)的那一行之后的位置
    • 执行result.append(9),把9加入结果列表
    • 打印aft app 9 False(节点9的right是17)
    • 检查node.right:节点17存在,打印inside right,调用io(17)
    • io(9)暂停,状态压入调用栈
  8. 进入io(17):

    • 打印restart、b4 app 17
    • 检查左子节点:不存在,跳过左递归
    • 执行result.append(17),把17加入结果列表
    • 打印aft app 17 True(节点17的right是None)
    • 检查右子节点:不存在,跳过右递归
    • io(17)执行完毕,从调用栈弹出
  9. 最终回溯到io(9):

    • io(17)执行完后,io(9)的所有代码都执行完毕,从调用栈弹出
    • 最终返回结果列表[3, 4, 6, 9, 17]

额外的代码小提示

你的io函数存在一个潜在bug:如果node为None,执行result.append(node.data)会抛出AttributeError。虽然当前逻辑里只有node.left/node.right存在时才调用递归,不会传入None,但如果后续修改代码(比如直接传入None测试),就会触发错误。建议把result.append(node.data)放到if node is not None:的分支里,更安全。

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:02:52