文章目录

  • 前言
  • 一、前序遍历(迭代法)
  • 二.中序遍历(迭代法)
  • 三、后序遍历(迭代法)
  • 总结

前言

「递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中」,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。所以我们用栈也可以是实现二叉树的前后中序遍历。


一、前序遍历(迭代法)

前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。

为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候才是中左右的顺序。

注:前序遍历要访问的元素和要处理的元素顺序是一致的,都是中间节点

class Solution {public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*>st;vector<int> res;st.push(root);while(!st.empty()){TreeNode* node=st.top();//中st.pop();if(node!=nullptr){res.push_back(node->val);st.push(node->right);//右st.push(node->left); //左}}return res;}
};

二.中序遍历(迭代法)

中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了「处理顺序和访问顺序是不一致的。」

class Solution {public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;TreeNode* cur = root;while (cur != NULL || !st.empty()) {if(cur!=NULL){st.push(cur);cur=cur->left;//左}else{cur=st.top();// 从栈里弹出的数据,就是要处理的数据(放进res数组里的数据)st.pop();res.push_back(cur->val);//中cur=cur->right;         //右}}return res;}
};

三、后序遍历(迭代法)

先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图:

class Solution {public:vector<int> postorderTraversal(TreeNode* root) {vector<int>res;stack<TreeNode*>st;st.push(root);while(!st.empty()){TreeNode* node=st.top();st.pop();if(node!=NULL){res.push_back(node->val);st.push(node->left);st.push(node->right);}}reverse(res.begin(),res.end());return res;}
};

总结

先序:节点的访问顺序与处理顺序一致,所以直接处理栈顶元素(即将栈顶元素放入结果数组中),然后将右孩子、左孩子依次入栈(这样下次处理的栈顶元素就是左孩子)

中序:节点的访问顺序和处理顺序不一致。使用一个变量保存当前访问的节点,如果当前访问的节点有左孩子,当前节点压栈,当前节点指向该节点的左孩子;如果当前节点没有左孩子,那么处理该节点,然后继续访问该节点的右子树。

后序:先序遍历的顺序是中左右,使用先序的代码可以中右左遍历,然后反转就可以了

前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。思考一下 二叉树前后中序遍历的迭代法实现,能不能风格一?像递归写法一样稍作修改前序遍历的代码就可以实现中后序遍历?

二叉树的前中后序遍历之迭代法(非统一风格迭代方式)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【数据结构】二叉树的前中后序遍历

    二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...

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

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

  9. 二叉树的前中后序遍历(栈)(C++)

    二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下 #include<vector> #include<stack> struct TreeNod ...

最新文章

  1. 使用 Truffle Develop 和 console
  2. 官方文档翻译-ESP32-SPI Flash
  3. AS导入第三方库方法和PullToRefresh的简单使用
  4. @SpringBootApplication揭秘
  5. 怎么学ui设计入门?怎样才能少走弯路?
  6. 岗位理解_如何正确理解策划岗位
  7. windows创建任务计划(周期执行bat脚本)
  8. 成功自我暗示三大规律
  9. 医院叫号排队系统 php,医院排队叫号系统软件介绍
  10. 解决git clone fatal: port 443: Timed out
  11. xp系统共享服务器怎么设置权限,xp系统局域网设置权限不让其他人访问的方法...
  12. li标签中,img居中显示
  13. java mp3合并_java合并MP3文件
  14. java中13%(-3)_Java13版本特性【一文了解】
  15. 蓝奏网盘带密码文件分享下载链接分析思路
  16. ubuntu下 安装 wine QQ
  17. http性能和长短连接
  18. BZOJ 2961 共点圆 CDQ分治+凸包
  19. 呼叫中心系统的CRM客户管理模块的功能
  20. Eclipse安装Spring Tool Suit 插件

热门文章

  1. ISE调用Notepad++并且实现错误高亮定位的方法
  2. SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)
  3. String 类型切割成数组-转int数组-升列排序-拼接字符串、需求 有如下一个字符串 91 27 46 38 50
  4. php extname shared,PHP: 编写第一个PHP扩展
  5. [android] 百度地图开发 (二).定位城市位置和城市POI搜索
  6. 【数据结构与算法】之深入解析“股票价格波动”的求解思路与算法示例
  7. App设计灵感之十二组精美的地图导航App设计案例
  8. iOS逆向之深入解析App签名的双向验证机制和原理
  9. 2018年第九届蓝桥杯 - 省赛 - C/C++大学A组 - F.航班时间
  10. 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序