文章目录

  • 1. 题目信息
  • 2. 解法
    • 2.1 递归
    • 2.2 循环,必须掌握
      • a. 单栈
      • b. 双栈解法
  • 3. 前中后序总结

1. 题目信息

给定一个二叉树,返回它的 后序 遍历。

示例:输入: [1,null,2,3]  1\2/3 输出: [3,2,1]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解法

2.1 递归

class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int> ans;preorder(root, ans);return ans;}void preorder(TreeNode* root, vector<int> &ans){if(root == NULL)return;preorder(root->left, ans);preorder(root->right, ans);ans.push_back(root->val);}
};

2.2 循环,必须掌握

左右根

a. 单栈

  • 先按照"根-右-左"的顺序遍历二叉树(和先序遍历有些像),
  • 然后将遍历的结果反转过来就是“左-右-根”,也就是后序遍历了
class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> stk;while(root || !stk.empty()){while(root){stk.push(root);ans.push_back(root->val);root = root->right;}root = stk.top()->left;stk.pop();}//反转遍历结果reverse(ans.begin(),ans.end());return ans;}
};

以下解法会破坏二叉树

class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int> ans;if(root==NULL)return ans;TreeNode *cur;stack<TreeNode*> stk;stk.push(root);while(!stk.empty()){cur = stk.top();if(cur->left){stk.push(cur->left);cur->left = NULL;}else if(cur->right){stk.push(cur->right);cur->right = NULL;}else{ans.push_back(cur->val);stk.pop();}}return ans;}
};

b. 双栈解法

  • stk1,模仿前序遍历的实现“反后序遍历”
  • stk2,保存stk1的pop元素
class Solution {public:vector<int> postorderTraversal(TreeNode *root) {vector<int> ans;if(root == NULL) return ans;stack<TreeNode*> stk1;stack<TreeNode*> stk2;stk1.push(root);TreeNode *cur;while(!stk1.empty()){cur = stk1.top();stk1.pop();stk2.push(cur);if(cur->left)stk1.push(cur->left);if(cur->right)stk1.push(cur->right);}while(!stk2.empty()){cur = stk2.top();stk2.pop();ans.push_back(cur->val);}return ans;}
};

3. 前中后序总结

LeetCode 145. 二叉树的后序遍历(后序遍历总结)相关推荐

  1. Leetcode 145. 二叉树的后序遍历 (每日一题 20210930)

    给定一个二叉树,返回它的 后序 遍历.示例:输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?链接:https://leetcod ...

  2. [leetcode]145.二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 1.递归解法 class So ...

  3. leetcode 145 --- 二叉树后序遍历

    1 题目 用递归的方法对给定的二叉树进行后序遍历. 例如: 给定的二叉树为{1,#,2,3}, 返回[3,2,1]. 示例1 输入 {1,#,2,3} 输出 [3,2,1] 2 解法 2.1 递归解法 ...

  4. LeetCode —— 145. 二叉树的后序遍历【递归与迭代】(Python)

    给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法一:递归 # Definition for a binary tree node. # class Tr ...

  5. LeetCode 145 二叉树的后序遍历(非递归)

    题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1.使用一 ...

  6. LeetCode 145. 二叉树的后序遍历(递归)(迭代)(颜色标记法)

    题目描述 给定一个二叉树,返回它的后序遍历 思路 详见链接 代码 递归 #class TreeNode: # def __init__(self,x): # self.val = x # self.l ...

  7. LeetCode 145 ——二叉树的后序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到 ...

  8. LeetCode 545. 二叉树的边界(前序+后序)*

    文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉树,以逆时针顺序从根开始返回其边界. 边界按顺序包括左边界.叶子结点和右边界而不包括重复的结点. (结点的值可能重复) 左边界的定义是从根到最 ...

  9. LeetCode 297. 二叉树的序列化与反序列化(前序遍历层序遍历)

    文章目录 1. 题目 2. 解题 2.1 前序遍历 2.2 层序遍历 1. 题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过 ...

最新文章

  1. scp 命令 路径_基于SSH的文件传输:scp命令
  2. CMD命令行接收用户输入信息
  3. 字符集:ASCII、GB2312、GBK、GB18030、Unicode
  4. oracle主备库查询,oracle11g dataguard 备库数据同步的检查方法
  5. 在gradle中构建java项目
  6. bootstrap-table.js如何根据单元格数据不同显示不同的字体的颜色
  7. 常见的几款JVM监控工具
  8. 为什么到最后还是要 专注于博客写作
  9. bzoj 4556 字符串 —— 后缀数组+主席树
  10. uci2019计算机录取,最新!加州大学公布2019年新生录取数据!
  11. 数学分析教程(科大)——1.12笔记+习题
  12. 计算机显示去掉拼音分类,win10系统取消电脑文件显示以字母数字拼音分组的解决方法...
  13. IDEA工具-鼠标滚轮调整字体大小
  14. 浅析Kubelet如何上报状态
  15. 【Educoder作业】CC++指针实训
  16. 主持人正确发声练习方法
  17. Python:数据匹配
  18. python selenium的xpath的使用
  19. 获取该字符串表示的日期是星期几,以及这一年的第几天?
  20. 嵌入式GUI FTK设计与实现-事件源(FtkSource)

热门文章

  1. DebugView使用笔记
  2. 简单的深度优先遍历和广度优先遍历
  3. jquery如何获取checkbox的值
  4. Python 面向对象编程
  5. 2.简易的登录页面(表单验证)(HTML+JavaScript+Jquery)
  6. 腾讯云挂在和格式化数据盘
  7. Txt格式配置表无法解析的问题——BOM
  8. scala学习-类与对象
  9. C#快速导入海量XML数据至SQL Server数据库
  10. void init(void) 分析 ! \linux-1.0\init\main.c