商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++二叉树后序遍历实现方法

C++二叉树后序遍历实现方法

  发布于2025-11-25 阅读(0)

扫一扫,手机访问

答案是:C++中二叉树后序遍历有递归和迭代两种方法,顺序为左→右→根,递归简洁但可能栈溢出,迭代用栈模拟,适合深树。

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

在C++中实现二叉树的后序遍历,主要有两种方法:递归和迭代。后序遍历的顺序是“左子树 → 右子树 → 根节点”,适合用于释放树节点或计算表达式树等场景。

定义二叉树节点结构

在开始前,先定义一个基本的二叉树节点结构:

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

方法一:递归实现

递归是最直观的方式,按照“左→右→根”的顺序访问节点。


void postorderTraversalRecursive(TreeNode* root) {
    if (root == nullptr) return;
postorderTraversalRecursive(root->left);  // 遍历左子树
postorderTraversalRecursive(root->right); // 遍历右子树
std::cout << root->val << " ";            // 访问根节点

}

优点是代码简洁易懂,缺点是在树很深时可能引发栈溢出。

方法二:迭代实现(使用栈)

迭代法用显式栈模拟递归过程。关键点是判断节点是否已经处理过右子树。

一种常见做法是使用一个指针记录上一个访问的节点,避免重复进入右子树:

void postorderTraversalIterative(TreeNode* root) {
    if (root == nullptr) return;
std::stack<TreeNode*> stack;
TreeNode* lastVisited = nullptr;
TreeNode* current = root;

while (current != nullptr || !stack.empty()) {
    if (current != nullptr) {
        stack.push(current);
        current = current->left;  // 一直向左走
    } else {
        TreeNode* peekNode = stack.top();
        // 如果右子树存在且未被访问过,进入右子树
        if (peekNode->right != nullptr && lastVisited != peekNode->right) {
            current = peekNode->right;
        } else {
            std::cout << peekNode->val << " ";
            lastVisited = stack.top();
            stack.pop();
        }
    }
}

}

这种方法空间复杂度为O(h),h为树的高度,适合深度较大的树。

测试示例

你可以这样测试上述代码:

int main() {
    TreeNode* root = new TreeNode(1);
    root->right = new TreeNode(2);
    root->right->left = new TreeNode(3);
std::cout << "后序遍历结果: ";
postorderTraversalRecursive(root); // 输出: 3 2 1
std::cout << std::endl;

return 0;

}

基本上就这些。递归写起来快,迭代更安全。根据实际需求选择合适的方法即可。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。
  • PHP日期字符串转换失败怎么解决 正版软件
    PHP日期字符串转换失败怎么解决
    PHP日期解析失败需检查格式、函数限制、异常捕获、时区及分隔符:一、确认字符串为ISO或英文标准格式,清理不可见字符;二、strtotime()不支持中文、毫秒、模糊表述;三、DateTime类配合try-catch和createFromFormat更可靠;四、统一时区并避免locale依赖;五、规范分隔符与顺序,优先显式指定格式模板。
    4小时前 23:45 0
  • 宝塔面板Nginx日志自动清理方法 正版软件
    宝塔面板Nginx日志自动清理方法
    直接删access.log会导致Nginx不写日志,因其仍通过文件描述符向已删除但未关闭的文件写入,且部分版本不会自动重建日志文件;正确做法是用kill-USR1信号通知Nginx重新打开日志文件。
    4小时前 23:30 0
  • 如何用正则匹配带前缀和日期的字符串 正版软件
    如何用正则匹配带前缀和日期的字符串
    本文介绍如何用单条正则表达式高效筛选同时满足“以pty开头”和“包含指定日期数字(如20022023)”两个条件的字符串,替代多步遍历与分段判断,提升代码简洁性与可读性。
    5小时前 23:15 0
  • Pandas教程:分组与条件判断添加列方法 正版软件
    Pandas教程:分组与条件判断添加列方法
    本文旨在讲解如何使用Pandas在数据框中基于分组和条件判断来创建新的列。通过groupby()、apply()、sort_values()、shift()和cumsum()等函数,可以实现复杂的数据转换和计算,从而生成符合特定业务逻辑的新列。文章提供详细的代码示例和步骤解释,帮助读者理解并掌握该技巧。
    5小时前 23:00 0
  • Scikit-learn旧版安装教程详解 正版软件
    Scikit-learn旧版安装教程详解
    本教程旨在指导用户如何安装指定版本的Scikit-learn库,以应对特定场景,例如访问已被新版本移除的旧数据集或保持与遗留代码的兼容性。文章将详细介绍使用pip和conda两种主流包管理器进行版本安装的方法,并提供强制重装、指定源等高级选项,同时强调使用虚拟环境的重要性及版本选择时的注意事项。
    5小时前 22:45 0