⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal

⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C++实现)Binary Tree Inorder Traversal
⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C++实现)Binary Tree Preorder Traversal

Given the root of a binary tree, return the postorder traversal of its nodes' values.

Example 1:

复制代码
Input: root = [1,null,2,3]
Output: [3,2,1]

Explanation:

Example 2:

复制代码
Input: root = [1,2,3,4,5,null,8,null,null,6,7,9]
Output: [4,6,7,5,2,9,8,3,1]

Explanation:

Example 3:

复制代码
Input: root = []
Output: []

Example 4:

复制代码
Input: root = [1]
Output: [1]
cpp 复制代码
// 定义二叉树节点
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

递归解法

  • 后序遍历的顺序是:左子树 → \rightarrow → 右子树 → \rightarrow → 根节点。
  • 使用递归实现。
cpp 复制代码
#include <vector>
using namespace std;

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result; // 存储遍历结果
        postorder(root, result); // 递归遍历
        return result;
    }

private:
    void postorder(TreeNode* node, vector<int>& result) {
        if (node == nullptr) {
            return; // 递归终止条件
        }
        postorder(node->left, result); // 遍历左子树
        postorder(node->right, result); // 遍历右子树
        result.push_back(node->val); // 访问根节点
    }
};

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的节点数。每个节点被访问一次。
  • 空间复杂度: O ( h ) O(h) O(h),其中 h h h 是二叉树的高度。递归调用栈的深度取决于树的高度。

迭代解法(使用栈)

  • 使用 模拟递归过程。
  • 每次从栈中弹出一个节点,将其值插入结果列表的开头。
  • 先压入左子树,再压入右子树,以确保右子树先被处理。从根节点开始,先将所有左子节点入栈,然后访问节点,再转向右子树。
cpp 复制代码
#include <vector>
#include <stack>
using namespace std;

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        if (root == nullptr) {
            return result;
        }
        stack<TreeNode*> stk;
        stk.push(root);
        while (!stk.empty()) {
            TreeNode* node = stk.top();
            stk.pop();
            result.insert(result.begin(), node->val); // 将节点值插入结果的开头
            if (node->left) {
                stk.push(node->left); // 先压入左子树
            }
            if (node->right) {
                stk.push(node->right); // 再压入右子树
            }
        }
        return result;
    }
};
相关推荐
应用市场几秒前
本地局域网邮件管理系统:从原理到实现的完整指南
开发语言
Tony Bai23 分钟前
【Go 网络编程全解】12 本地高速公路:Unix 域套接字与网络设备信息
开发语言·网络·后端·golang·unix
爱coding的橙子25 分钟前
每日算法刷题Day78:10.23:leetcode 一般树7道题,用时1h30min
算法·leetcode·深度优先
Swift社区27 分钟前
LeetCode 403 - 青蛙过河
算法·leetcode·职场和发展
地平线开发者28 分钟前
三种 Badcase 精度验证方案详解与 hbm_infer 部署实录
算法·自动驾驶
oioihoii33 分钟前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++
报错小能手37 分钟前
项目——基于C/S架构的预约系统平台 (1)
开发语言·c++·笔记·学习·架构
papership39 分钟前
【入门级-算法-5、数值处理算法:高精度的减法】
算法·1024程序员节
lingran__43 分钟前
算法沉淀第十天(牛客2025秋季算法编程训练联赛2-基础组 和 奇怪的电梯)
c++·算法
DuHz1 小时前
基于MIMO FMCW雷达的二维角度分析多径抑制技术——论文阅读
论文阅读·物联网·算法·信息与通信·毫米波雷达