如何编写该树的正确递归postorder(后序遍历)代码?附preorder参考
递归后序遍历代码正确性核验
你的现有后序遍历代码不符合正确的递归模式,主要存在两处核心错误:
- 访问节点时机错误:后序遍历要求先完成所有子节点的遍历,最后再访问当前根节点,你现有代码把
visit(t)放在判断生效后的第一行,和前序逻辑一致,访问顺序完全不符合后序要求。 - 子节点处理逻辑缺失:你调用
t.descend()进入子节点层级后直接调用t.ascend()返回,没有在子节点层级完成所有子树的递归遍历,所有子节点都没有被正确处理。
你可以参考和前序代码逻辑对齐的正确后序实现,仅需要将visit(t)的调用时机从处理子树前调整到处理完所有子树后即可:
void postorderR (Tree &t) { if (t.on()) { // 进入子节点层级,遍历所有子树 t.descend(); indent = indent + 3; while (t.on()) { postorderR(t); t.move(); } t.ascend(); indent = indent - 3; // 所有子树处理完成后,访问当前节点 visit(t); } }
该实现完全符合后序遍历的递归模式,运行后即可输出你预期的结果。
内容的提问来源于stack exchange,提问作者lina das
相关产品推荐
相关产品推荐

