C++二叉树前序遍历两种递归写法的实现差异咨询
二叉树前序遍历两种递归实现的差异与错误分析
两种实现的核心差异
两种写法的递归遍历顺序逻辑完全一致,都是严格按照前序遍历「根节点->左子树->右子树」的顺序访问节点,核心区别只有存储遍历结果的容器的作用域不同:
- 第一版实现中,结果容器是
preorderTraversal函数的局部变量,每触发一次递归调用,就会独立创建一个全新的空vector,各层递归的容器互不关联,递归返回时局部容器就会被销毁。 - 第二版实现中,结果容器是定义在递归函数外层的共享变量,整个递归流程里所有层级的访问操作,都往同一个vector里追加节点值,不存在数据隔离。
第一版代码无法输出正确结果的原因
第一版代码的问题根本不是递归遍历顺序错了,而是递归调用拿到的左右子树遍历结果完全被丢弃了。
你每次调用preorderTraversal(root->left)和preorderTraversal(root->right)时,这两次调用确实会遍历对应的子树,也会把节点值存到那次调用生成的局部vector里,但你既没有接收这两个函数的返回值,也没有把里面存的子树结果合并到当前层的vector里,等递归调用结束,存了子树结果的局部vector就直接被内存回收了。
举个最典型的出错场景:根节点值为1,左孩子为空,右孩子值为2,代码实际执行流程是:
- 进入根节点调用层,新建空vector
final,压入根节点值1,此时final内容为[1] - 递归遍历左孩子(空指针),直接返回空vector,返回值未被接收,直接丢弃
- 递归遍历右孩子(值为2的节点):进入该层调用后新建另一个空vector
final,压入2,再递归遍历2的左右空孩子返回空,最终返回存了[2]的vector,这个返回值同样没有被根节点层接收,直接丢弃 - 根节点层返回自己的
final,里面只有[1],右子树的节点2完全丢失,结果自然错误。
修正第一版代码不需要改递归逻辑,只要把左右子树递归返回的结果合并到当前层的vector即可,不需要额外定义全局共享变量。
内容的提问来源于stack exchange,提问作者user19464912
相关产品推荐
相关产品推荐

