LeetCode 145. 二叉树的后序遍历(后序遍历总结)
文章目录
- 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. 二叉树的后序遍历(后序遍历总结)相关推荐
- Leetcode 145. 二叉树的后序遍历 (每日一题 20210930)
给定一个二叉树,返回它的 后序 遍历.示例:输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?链接:https://leetcod ...
- [leetcode]145.二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 1.递归解法 class So ...
- leetcode 145 --- 二叉树后序遍历
1 题目 用递归的方法对给定的二叉树进行后序遍历. 例如: 给定的二叉树为{1,#,2,3}, 返回[3,2,1]. 示例1 输入 {1,#,2,3} 输出 [3,2,1] 2 解法 2.1 递归解法 ...
- LeetCode —— 145. 二叉树的后序遍历【递归与迭代】(Python)
给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法一:递归 # Definition for a binary tree node. # class Tr ...
- LeetCode 145 二叉树的后序遍历(非递归)
题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1.使用一 ...
- LeetCode 145. 二叉树的后序遍历(递归)(迭代)(颜色标记法)
题目描述 给定一个二叉树,返回它的后序遍历 思路 详见链接 代码 递归 #class TreeNode: # def __init__(self,x): # self.val = x # self.l ...
- LeetCode 145 ——二叉树的后序遍历
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到 ...
- LeetCode 545. 二叉树的边界(前序+后序)*
文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉树,以逆时针顺序从根开始返回其边界. 边界按顺序包括左边界.叶子结点和右边界而不包括重复的结点. (结点的值可能重复) 左边界的定义是从根到最 ...
- LeetCode 297. 二叉树的序列化与反序列化(前序遍历层序遍历)
文章目录 1. 题目 2. 解题 2.1 前序遍历 2.2 层序遍历 1. 题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过 ...
最新文章
- scp 命令 路径_基于SSH的文件传输:scp命令
- CMD命令行接收用户输入信息
- 字符集:ASCII、GB2312、GBK、GB18030、Unicode
- oracle主备库查询,oracle11g dataguard 备库数据同步的检查方法
- 在gradle中构建java项目
- bootstrap-table.js如何根据单元格数据不同显示不同的字体的颜色
- 常见的几款JVM监控工具
- 为什么到最后还是要 专注于博客写作
- bzoj 4556 字符串 —— 后缀数组+主席树
- uci2019计算机录取,最新!加州大学公布2019年新生录取数据!
- 数学分析教程(科大)——1.12笔记+习题
- 计算机显示去掉拼音分类,win10系统取消电脑文件显示以字母数字拼音分组的解决方法...
- IDEA工具-鼠标滚轮调整字体大小
- 浅析Kubelet如何上报状态
- 【Educoder作业】CC++指针实训
- 主持人正确发声练习方法
- Python:数据匹配
- python selenium的xpath的使用
- 获取该字符串表示的日期是星期几,以及这一年的第几天?
- 嵌入式GUI FTK设计与实现-事件源(FtkSource)