morris后序遍历的三种o(1)空间解法:一、双翻转逆序法,通过左子树最右路径构建线索并两次翻转实现逆后序;二、右边界逆序打印法,分治处理各子树右边界并最后补全整树右边界;三、栈缓存混合法,仅用固定小栈缓存待访问根节点。

如果您需要在不使用递归栈或显式辅助栈的前提下完成二叉树的后序遍历,则必须面对Morris遍历中最具挑战性的变体:后序遍历无法自然回溯至根节点,且访问时机严格依赖左右子树全部处理完毕。以下是解决此问题的多种实现路径:
一、双翻转逆序法(标准解法)
该方法通过两次链表翻转模拟“逆后序”(根→右→左),再整体逆序输出,从而规避对栈或递归的依赖;其核心在于利用左子树最右路径构建临时线索,并在第二次抵达当前节点时沿该路径逆向收集节点值。
1、初始化当前节点 cur = root,结果容器 result 为空。
2、当 cur != nullptr 时,执行循环主体。
3、若 cur->left == nullptr,则暂不访问 cur,直接令 cur = cur->right。
4、若 cur->left != nullptr,查找其左子树最右节点 pred:从 pred = cur->left 开始,持续执行 pred = pred->right,直至 pred->right == nullptr || pred->right == cur。
5、若 pred->right == nullptr,设置 pred->right = cur,然后令 cur = cur->left。
6、若 pred->right == cur,先恢复结构:pred->right = nullptr;再执行翻转与输出:令 tail = cur->left,prev = nullptr,进入 while 循环(条件为 tail != cur),逐次翻转 tail->right 指针并前移;翻转完成后,从 prev 出发沿新右链反向收集值至 result,同时恢复原指针。
二、右边界逆序打印法(边界驱动法)
该方法放弃对整棵树做统一逆序,转而聚焦于每个子树的“右边界”——即从当前节点左子节点出发,持续向右直至空节点所形成的路径;每次在第二次抵达 cur 时,将该右边界节点值逆序压入结果,最终单独追加根节点所在整树右边界。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
1、定义辅助函数 printEdge(TreeNode* head, vector
2、主循环中,当检测到 pred->right == cur 时,调用 printEdge(cur->left, result),完成左子树右边界逆序输出。
3、主循环结束后,再次调用 printEdge(root, result),以补上整棵树的右边界节点(即后序中最后被访问的部分)。
4、确保所有被 printEdge 处理的子路径均未被重复翻转或破坏,且 cur->left == nullptr 的节点跳过该步骤。
三、栈缓存+Morris主干混合法(折中稳健法)
该方法保留Morris主干流程以控制空间复杂度为O(1),仅对后序必需的“待访问根节点”使用极小容量栈缓存;因后序中每个需二次抵达的节点仅需记录一次,故栈深度上限为树高,但在实践中可限制为固定大小(如64)并配合标记位判断溢出。
1、声明固定大小栈 stack
2、在Morris主循环中,当识别出 pred->right == cur 且 cur->right != nullptr 时,将 cur 压入 pendingRoots(若未满)。
3、当 cur->right == nullptr 或 cur 已无子树时,立即输出 cur->val;随后检查栈顶,若其右子树已处理完毕,则弹出并输出。
4、每次压栈前校验 pendingRoots.size() ,若超限则退化为局部递归处理该子树,避免栈溢出。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










