首页 > 后端开发 > C++ > 正文

c++中如何实现二叉树后序遍历非递归_c++二叉树后序非递归遍历方法

尼克
发布: 2025-09-30 15:52:02
原创
626人浏览过
后序遍历非递归实现的关键是使用单栈配合last指针判断右子树是否已访问,先沿左路入栈,再根据右子树状态决定访问节点或转向右子树,最后更新last指针。

c++中如何实现二叉树后序遍历非递归_c++二叉树后序非递归遍历方法

在C++中实现二叉树的后序遍历非递归方式,关键在于模拟系统的行为,同时确保每个节点在左右子树都访问完毕后再处理自身。与前序和中序不同,后序遍历的非递归实现稍复杂,需要额外判断是否已经访问过子树。

使用单栈实现后序遍历(推荐方法)

核心思路是利用一个栈记录待处理的节点,并用一个指针记录上一次访问的节点,以此判断当前节点的右子树是否已访问。

  • 从根节点开始,将所有“左路”节点入栈(类似中序遍历)
  • 取栈顶节点,但不立即弹出,检查其右子树是否为空或已被访问
  • 若满足条件,则访问该节点并弹出;否则进入右子树继续处理
  • 用 last 指针记录最近访问的节点,避免重复进入右子树

代码实现如下:

```cpp #include #include using namespace std;

struct TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };

void postorderTraversal(TreeNode* root) { if (!root) return;

stack<TreeNode*> stk;
TreeNode* last = nullptr;        // 记录上一个访问的节点
TreeNode* curr = root;

while (curr || !stk.empty()) {
    // 一路向左入栈
    while (curr) {
        stk.push(curr);
        curr = curr->left;
    }

    // 取栈顶,不弹出
    curr = stk.top();

    // 如果右子树为空,或右子树已访问过
    if (!curr->right || curr->right == last) {
        cout << curr->val << " ";
        stk.pop();
        last = curr;           // 更新最后访问节点
        curr = nullptr;        // 避免重复进入左子树
    } else {
        curr = curr->right;    // 进入右子树
    }
}
登录后复制

}

大师兄智慧家政
大师兄智慧家政

58到家打造的AI智能营销工具

大师兄智慧家政 99
查看详情 大师兄智慧家政

立即学习C++免费学习笔记(深入)”;

<H3>双栈法(易于理解)</H3>
<p>另一种方法是使用两个栈:第一个栈按“根→右→左”的顺序压入节点,第二个栈用于反转输出顺序,最终得到“左→右→根”。</p>
<font color="#000000">
<ul>
  <li>先将根入栈1</li>
  <li>每次从栈1弹出节点,压入栈2,并依次将左、右孩子压入栈1</li>
  <li>最后依次弹出栈2,即为后序结果</li>
</ul>
</font>

<p>代码示例:</p>
```cpp
void postorderTwoStacks(TreeNode* root) {
    if (!root) return;

    stack<TreeNode*> stk1, stk2;
    stk1.push(root);

    while (!stk1.empty()) {
        TreeNode* node = stk1.top(); stk1.pop();
        stk2.push(node);

        if (node->left)  stk1.push(node->left);
        if (node->right) stk1.push(node->right);
    }

    // 输出栈2
    while (!stk2.empty()) {
        cout << stk2.top()->val << " ";
        stk2.pop();
    }
}
登录后复制

注意事项与技巧

单栈法空间效率更高,是面试常见写法。关键点在于 last 指针的使用,它解决了“如何判断右子树已访问”的问题。双栈法逻辑清晰,适合初学者理解后序的本质——逆前序的一种变形。

测试时建议构造如下树验证:
    1
  /   \
 2     3
/
4
正确输出应为:4 2 3 1

基本上就这些,掌握单栈法足以应对大多数场景。

以上就是c++++中如何实现二叉树后序遍历非递归_c++二叉树后序非递归遍历方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号