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

C++二叉树前序遍历两种递归写法的实现差异咨询

二叉树前序遍历两种递归实现的差异与错误分析

两种实现的核心差异

两种写法的递归遍历顺序逻辑完全一致,都是严格按照前序遍历「根节点->左子树->右子树」的顺序访问节点,核心区别只有存储遍历结果的容器的作用域不同:

  • 第一版实现中,结果容器是preorderTraversal函数的局部变量,每触发一次递归调用,就会独立创建一个全新的空vector,各层递归的容器互不关联,递归返回时局部容器就会被销毁。
  • 第二版实现中,结果容器是定义在递归函数外层的共享变量,整个递归流程里所有层级的访问操作,都往同一个vector里追加节点值,不存在数据隔离。

第一版代码无法输出正确结果的原因

第一版代码的问题根本不是递归遍历顺序错了,而是递归调用拿到的左右子树遍历结果完全被丢弃了。
你每次调用preorderTraversal(root->left)和preorderTraversal(root->right)时,这两次调用确实会遍历对应的子树,也会把节点值存到那次调用生成的局部vector里,但你既没有接收这两个函数的返回值,也没有把里面存的子树结果合并到当前层的vector里,等递归调用结束,存了子树结果的局部vector就直接被内存回收了。
举个最典型的出错场景:根节点值为1,左孩子为空,右孩子值为2,代码实际执行流程是:

  1. 进入根节点调用层,新建空vectorfinal,压入根节点值1,此时final内容为[1]
  2. 递归遍历左孩子(空指针),直接返回空vector,返回值未被接收,直接丢弃
  3. 递归遍历右孩子(值为2的节点):进入该层调用后新建另一个空vectorfinal,压入2,再递归遍历2的左右空孩子返回空,最终返回存了[2]的vector,这个返回值同样没有被根节点层接收,直接丢弃
  4. 根节点层返回自己的final,里面只有[1],右子树的节点2完全丢失,结果自然错误。

修正第一版代码不需要改递归逻辑,只要把左右子树递归返回的结果合并到当前层的vector即可,不需要额外定义全局共享变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:21:26