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

张春  金牌会员 | 2025-3-21 21:19:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 982|帖子 982|积分 2946

⭐算法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:
  1. Input: root = [1,null,2,3]
  2. Output: [3,2,1]
复制代码
Explanation:

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

Example 3:
  1. Input: root = []
  2. Output: []
复制代码
Example 4:
  1. Input: root = [1]
  2. Output: [1]
复制代码
  1. // 定义二叉树节点
  2. struct TreeNode {
  3.     int val;
  4.     TreeNode* left;
  5.     TreeNode* right;
  6.     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  7. };
复制代码
递归解法



  • 后序遍历的次序是:左子树                                         →                                  \rightarrow                     → 右子树                                         →                                  \rightarrow                     → 根节点。
  • 使用递归实现。
  1. #include <vector>
  2. using namespace std;
  3. class Solution {
  4. public:
  5.     vector<int> postorderTraversal(TreeNode* root) {
  6.         vector<int> result; // 存储遍历结果
  7.         postorder(root, result); // 递归遍历
  8.         return result;
  9.     }
  10. private:
  11.     void postorder(TreeNode* node, vector<int>& result) {
  12.         if (node == nullptr) {
  13.             return; // 递归终止条件
  14.         }
  15.         postorder(node->left, result); // 遍历左子树
  16.         postorder(node->right, result); // 遍历右子树
  17.         result.push_back(node->val); // 访问根节点
  18.     }
  19. };
复制代码
复杂度分析



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



  • 使用 模仿递归过程。
  • 每次从栈中弹出一个节点,将其值插入效果列表的开头。
  • 先压入左子树,再压入右子树,以确保右子树先被处理。从根节点开始,先将所有左子节点入栈,然后访问节点,再转向右子树。
  1. #include <vector>
  2. #include <stack>
  3. using namespace std;
  4. class Solution {
  5. public:
  6.     vector<int> postorderTraversal(TreeNode* root) {
  7.         vector<int> result;
  8.         if (root == nullptr) {
  9.             return result;
  10.         }
  11.         stack<TreeNode*> stk;
  12.         stk.push(root);
  13.         while (!stk.empty()) {
  14.             TreeNode* node = stk.top();
  15.             stk.pop();
  16.             result.insert(result.begin(), node->val); // 将节点值插入结果的开头
  17.             if (node->left) {
  18.                 stk.push(node->left); // 先压入左子树
  19.             }
  20.             if (node->right) {
  21.                 stk.push(node->right); // 再压入右子树
  22.             }
  23.         }
  24.         return result;
  25.     }
  26. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表