力扣题目:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

今天自己琢磨了很久如何不用递归将二叉树的遍历写出来,于是乎写出了如下代码。
优点:前中后序均只需要改一行代码的顺序;树的结构不会被破坏。

用栈显式的实现遍历,栈中元素为pair结构体,first是TreeNode*,second是int整形作为一个标记,0表示该树结点未被拓展(访问)过,1表示已经拓展过了。
思路(这里针对中序遍历)是栈中存放元素,如果第一次访问某个结点,将该结点出栈,然后若其右子结点非空,则入栈,然后该结点的标记位记为1然后再入栈,之后左子结点非空则入栈(前序和后序也只是在这里有区别)。之后什么时候输出呢,就是栈顶元素的标记位为1时输出:若为中间结点,这表示该结点已经拓展过了,不能再拓展了,若为叶子结点,则是拓展该结点是还是只有其本身进栈了。
处理一个结点时的顺序是右子结点进栈再左子结点进栈,而这个其本身进展的位置就决定了这是前序还是中序后序遍历。
Talk is cheap. show me the code.

class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> answer;
stack<pair<TreeNode*,int>> data;
if(root == NULL) return answer;
data.push({root,0});
while(!data.empty()){
auto top = data.top();
data.pop();
TreeNode* tem = top.first;
int yesNode = top.second;
if(yesNode == 1){
answer.push_back(tem->val);
}
else{
if(tem->right != NULL) data.push({tem->right,0});
data.push({tem,1});
if(tem->left != NULL) data.push({tem->left,0});
}
}
return answer;
}
};

【C++】二叉树的遍历(前中后)- 迭代法的更多相关文章

  1. 二叉树的建立&&前中后遍历(递归实现)&&层次遍历

    下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...

  2. Qt实现 动态化遍历二叉树(前中后层次遍历)

    binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...

  3. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  4. [C++] 非递归实现前中后序遍历二叉树

    目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...

  5. 前中后序递归遍历树的体会 with Python

    前序:跟->左->右 中序:左->根->右 后序:左>右->根 采用递归遍历时,编译器/解释器负责将递归函数调用过程压入栈并保护现场,在不同位置处理根节点即可实现不 ...

  6. kmp(前中后最长相同长度)

    http://acm.hdu.edu.cn/showproblem.php?pid=4763 Theme Section Time Limit: 2000/1000 MS (Java/Others)  ...

  7. Binary Tree Traversal 二叉树的前中后序遍历

    [抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...

  8. POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

    链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...

  9. 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现

    文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...

随机推荐

  1. laravel7 webuploader上传图片

    webuploader上传 前提工作: 1>了解 代码如下:1.app_path() app_path函数返回app目录的绝对路径: $path = app_path(); 你还可以使用app_ ...

  2. BBS 项目(四)

    目录 BBS 项目(四) 首页布局 个人头像显示 个人站点路由设计 个人站点页面设计 base.html site.html 左侧过滤功能 404.html BBS 项目(四) 首页布局 <!D ...

  3. LGCF235B题解

    简单期望/fad 题意明确,不说了. 对于高次期望,一个套路的方法是维护低次期望(?) 考虑 dp,设 \(dp1[i]\) 为前 \(i\) 次点击中 所有连续的 \(O\) 的长度之和,\(dp2 ...

  4. .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人

    基于前文介绍的Ribbon界面.插件化.MVVM模式等内容,我们搭建了一个软件雏形.本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块. 1 目标 基于M ...

  5. 串和KMP算法

    一.串 串是由零个或多个字符串组成的有限序列 (一).串的定义 定长顺序存储 特点:每个串变量分配一个固定长度的存储区,即定长数组 定义: #define MAXLEN 255 typedef str ...

  6. 常用正则表达式与python中的re模块

    正则表达式是一种通用的字符串匹配技术,不会因为编程语言不一样而发生变化. 部分常用正则表达式规则介绍: . 匹配任意的一个字符串,除了\n * 匹配任意字符串0次或者任意次 \w 匹配字母.数字.下划 ...

  7. CVE-2017-12635(Couchdb垂直权限绕过漏洞)

    简介 Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapRedu ...

  8. redis的事件处理机制

    redis的事件处理机制 redis是单进程,单线程模型,与nginx的多进程不同,与golang的多协程也不同,"工作的工人"那么少,可那么为什么redis能这么快呢? epol ...

  9. 手把手带你使用ZigBee——通过爱智控制EFR32,以及 Simplicity Studio 使用过程中注意事项

    前言 兄弟们,我发现一个有意思的东西,我在爱智官网翻资料的时候,发现他们终于终于把官网文档的索引优化了!有一说一,真是方便不少,终于不再是一堆文档糊在一坨了. 另外我还发现他们居然做了一个EFR32的 ...

  10. SpringBoot bean映射yml中的属性举例

    pom:导入配置文件处理器,配置文件进行绑定就会有提示 <dependency> <groupId>org.springframework.boot</groupId&g ...