Morris后序遍历通过线索化构建反向路径并就地翻转输出,全程O(1)空间:先以右指针建临时链,再翻转cur→left到pre的路径批量输出,最后恢复树结构。

要用C++实现真正零辅助空间的二叉树后序遍历,必须绕过栈和递归调用栈——Morris后序遍历通过临时修改右子指针构建线索,再在回溯时翻转路径并批量输出节点,全程仅用常数额外变量。
Morris后序遍历核心思想
后序遍历(左→右→根)无法像前序、中序那样直接在线索化过程中输出;必须先访问到某个子树的最右节点,再沿其左上路径“倒着”输出整条链。因此算法分两阶段:先用Morris线索化构造反向路径,再对每段路径执行就地翻转并输出,最后恢复树结构。
关键在于:每次准备翻转路径前,【必须确保当前节点的右子指针已被临时设为nullptr,否则翻转会误连其他分支】。
构建反向访问路径
第一步:从根节点开始,对每个当前节点cur做如下判断:
立即学习“C++免费学习笔记(深入)”;
若cur无左子节点,则cur = cur→right;
若cur有左子节点,则找到其左子树的最右节点pre;
若pre→right为nullptr,令pre→right = cur,cur = cur→left;
若pre→right == cur,说明左子树已处理完毕,此时将cur→left到pre这一整段路径翻转,并从pre开始正向输出所有节点(即后序中“左→右”的部分),之后恢复该段路径指针,再令cur = cur→right。
就地翻转并输出路径
方法一:路径翻转函数
定义reversePath(Node* from, Node* to),将from到to(含)之间的右指针全部反转,使to成为新链头,from成为尾;翻转后从to开始遍历,每访问一个节点就输出其val;遍历完后再调用一次reversePath(to, from)恢复原结构。
注意:翻转时必须严格控制边界——当curr == to→right时停止,否则会越界篡改无关指针。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
方法二:内联翻转逻辑
不封装函数,在主循环中直接用三指针prev/curr/next完成翻转:初始化prev = nullptr,curr = from;循环中next = curr→right,curr→right = prev,prev = curr,curr = next,直到curr == to→right为止。
完整C++代码实现
struct TreeNode { int val; TreeNode *left, *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };
vector
while (cur) { if (!cur→left) { cur = cur→right; }
else { TreeNode* pre = cur→left; while (pre→right && pre→right != cur) pre = pre→right;
if (!pre→right) { pre→right = cur; cur = cur→left; }
else { pre→right = nullptr; reversePath(cur→left, pre, res); cur = cur→right; } } }
delete dummy; return res; }
void reversePath(TreeNode* from, TreeNode* to, vector
while (true) { next = curr→right; curr→right = prev; res.push_back(curr→val); if (curr == to) break; prev = curr; curr = next; }
while (prev) { next = prev→right; prev→right = curr; curr = prev; prev = next; } }

















