二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下

#include<vector>
#include<stack>
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {TreeNode *p = root;vector<int> ans;stack<TreeNode *> stk;stk.push(p);while (!stk.empty()) {p = stk.top();//取的时候便先取在头上的左子树stk.pop();ans.push_back(p->val);if (!p->right) stk.push(p->right);//先压右子树,因为是栈,先压右后压左,取的时候就可以先取左子树if (!p->left) stk.push(p->left);}return ans;}vector<int> inorderTraversal(TreeNode* root) {TreeNode* p = root;stack<TreeNode*> stack;vector<int> ret;while (!stack.empty() || p != nullptr) {  // 栈不为空或者树还没有遍历完while (p != nullptr) {       // 扫描结点p的所有左子结点并进栈stack.push(p);      // 一颗树的左边界进栈,左孩子结点进栈p = p->left;}//如果该节点是左子节点且到头了,就会连续两次弹栈(因为该节点的right是空,会再弹一次),然//后把指针指到右子节点,从而达到左-根-右的效果p = stack.top();    // 弹出结点,并记录结点值stack.pop();ret.push_back(p->val);p = p->right;       // 处理右子树}return ret;}vector<int> postorderTraversal(TreeNode *root) {vector<int> res;stack<TreeNode *> stk;TreeNode *prev = nullptr;//prev是来标记节点的,目的是看某个根是否应该入reswhile (root != nullptr || !stk.empty()) {while (root != nullptr) {//同中序stk.push(root);root = root->left;}root = stk.top();stk.pop();if (root->right == nullptr || root->right == prev) {//root->right==nullptr不必说,//如果root->right==prev,即这个根的右子节点已经入res了,这时候这个根也该入res了res.push_back(root->val);prev = root;root = nullptr;}else {
//else即是说这个根节点的右子节点存在且没入res,所以刚刚把这个根弹出后又要再次入栈,并且让root
//指向它的右子节点stk.push(root);root = root->right;}}return res;}
};

后序遍历还有一种方法,就是照着前序的写,最后用reverse把容器翻转一下就是答案

二叉树的前中后序遍历(栈)(C++)相关推荐

  1. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  2. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  3. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  4. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

    文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...

  5. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  6. 二叉树的前中后序遍历(考试常考)

    二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根).         由于树是通过 ...

  7. (必背)二叉树的前中后序遍历(利用栈)

    二叉树的前序遍历(利用栈) 1.首先将根节点压入栈 2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话) 3.重复步骤2直到栈为空 class Solu ...

  8. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)

    一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...

  9. Java~二叉树的前中后序遍历的几种方式(递归法,迭代法,标记法等)

    目录 一.结点的定义 二.递归法遍历二叉树 前序遍历 中序遍历 后序遍历 三.迭代(非递归)遍历二叉树 (1).迭代模拟法 前序遍历 中序遍历 后序遍历 (2).空指针标记法 前序遍历 中序遍历 后序 ...

最新文章

  1. SAP PP为工单创建好HU之后,如何查询HU号码?
  2. Digg 让 八 动起来,让 八 产生价值
  3. Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)
  4. 纯java生成excel
  5. android学汇资料总整理
  6. C和指针之函数之求参数列表中的最大值
  7. A Byte of Python 笔记(12)python 标准库:sys、os,更多内容
  8. python常用代码总结-python个人总结
  9. Android AbsoluteLayout 绝对布局
  10. PyQt4 UI设计和调用 使用eric6
  11. oracle 获取异常 信息,oracle存储过程异常信息的显示
  12. 为什么下一个十年的主战场在Serverless
  13. 动视暴雪消费产品集团首次亮相2018年中国授权展
  14. PHP连接MySQL数据库过程
  15. 针对ABCmouse的Xadmin管理端使用探究手册
  16. android string.join java8_Java8 - 更优雅的字符串连接(join)收集器 Collectors.joining
  17. mysql match 中文_Mysql全文搜索match against的用法
  18. 聊聊 Vue 中 provide/inject 的应用
  19. #TP4056#--3.7V锂电池充放电电路(实践日志篇)
  20. Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'idweb')

热门文章

  1. 反种族主义算法的偏见与警务简介
  2. win10 win11 系统安装指南
  3. CCC3.0学习笔记_认证和隐私保护
  4. 记一次惨痛的安装教训RegisterAddon
  5. 在xp下加载正常的dll,在win7下loadlibrary失败,返回错误值998(ERROR_NOACCESS)的解决办法
  6. 电脑密码忘了怎么解除?最简单操作的方法
  7. [MyBatis] 通过代码配置+XML文件构建SqlSessionFactory
  8. C++Primer——第8章(IO库)
  9. 测试软件安装可以用影子系统吗,什么是影子系统? 影子系统安装使用图文教程...
  10. Windows Media Encode 9简介及SDK