前序遍历-根左右:

循环到左子树空,else转右子树,当一个结点已经访问右子树时,该结点出栈

#include<iostream>
#include<string>
#include<stack>
#include<sstream>
#include<vector>
using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> treestack;TreeNode* tem = root;while(!treestack.empty()||tem){//栈空防止指针指空 if(tem){ans.push_back(tem->val);//前序在这里进行内容的读取 treestack.push(tem);//在这里入栈,减少判断次数 tem = tem->left;}//左子树到底了else{tem = treestack.top();treestack.pop();//左空就算结束,要弹出 tem = tem->right;}}return ans;}
};int main(){TreeNode* root = new TreeNode(6);root->left = new TreeNode(2);root->left->left = new TreeNode(1);root->left->right = new TreeNode(4);root->left->right->left = new TreeNode(3);root->left->right->right = new TreeNode(5);root->right = new TreeNode(7);root->right->right = new TreeNode(8);root->right->right->left = new TreeNode(9);Solution s;vector<int> v = s.preorderTraversal(root);for(int i=0;i<v.size();i++){cout<<v[i]<<endl;}return 0;
} 

中序遍历-左根右:

原理同前序,因为总是访问右子树时出栈,意味着出栈结点左子树空,即我们要访问的结点

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> treestack;TreeNode* tem = root;while(!treestack.empty()||tem){//栈空防止指针指空 if(tem){treestack.push(tem);//在这里入栈,减少判断次数 tem = tem->left;}//左子树到底了else{tem = treestack.top();treestack.pop();//左空就算结束,要弹出 ans.push_back(tem->val);//中序在这里进行内容的读取 tem = tem->right;}}return ans;}
};

后序遍历-左右根:

后序非递归遍历一般有两种思路

①变左右根为根右左再取反

即先类似前序遍历得到根右左的结果,然后再对结果取反,思路是简单可行的,但是不方便对树进行其他操作,只能看遍历结果

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> ans,fin;stack<TreeNode*> treestack;TreeNode* tem = root;while(!treestack.empty()||tem){//栈空防止指针指空 if(tem){ans.push_back(tem->val);treestack.push(tem);//在这里入栈,减少判断次数 tem = tem->right;}//左子树到底了else{tem = treestack.top();treestack.pop();//左空就算结束,要弹出 tem = tem->left;}}for(int i=ans.size()-1;i>=0;i--){fin.push_back(ans[i]);}return fin;}
};

②当前结点没有孩子或孩子都被访问时访问此结点

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {TreeNode* tem;//注意这里不需要初始化stack<TreeNode*> treestack;treestack.push(root);//根要先入栈,这一点与前面不同vector<int> ans;TreeNode* pre = NULL;while(!treestack.empty()){//判断条件只需要栈不空tem = treestack.top();if((tem->left==NULL&&tem->right==NULL)||(pre!=NULL&&(pre==tem->left||pre==tem->right))){//子树空或子树都已经被访问过 ans.push_back(tem->val);treestack.pop();pre = tem;}else{if(tem->right!=NULL)treestack.push(tem->right);//先右子树入栈if(tem->left!=NULL)treestack.push(tem->left);//再左子树入栈,实际上也是根右左,只不过栈是后进先出}}return ans;}
};

C++前序中序后序非递归遍历相关推荐

  1. 二叉树的前、中、后的非递归遍历

    题目 实现一个链式存储的二叉树,采用非递归的形式,按照前.中.后序的顺序遍历二叉树. 代码 /** * 二叉树的前.中.后序的非递归遍历 **/#include <iostream> us ...

  2. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  3. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

  4. C++实现递归,非递归遍历二叉树(前序,中序,后序)

    初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...

  5. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  6. C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

     二叉树的非递归遍历C/C++实现:   非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...

  7. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  8. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  9. 二叉树的先中后序递归和非递归遍历(数据结构作业)

    一.设计思想 我创建二叉树是用的先序创建,其中用'#'代表空节点. 1.递归先序遍历 (1)如果当前节点为空节点(用'#'代表空节点),结束当前函数 (2)打印当前节点 (2)递归当前节点的左子树 ( ...

  10. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

最新文章

  1. 2021毛纲源常考题型解题方法_总结2021年考研数学六大常考题型
  2. 使用PowerDesigner导入SQL生成数据表模型
  3. 开发机器上利用vs2013调试远程IIS上的c#程序
  4. canvas rotate 累加旋转_高考数列通项公式解题方法(1):观察法、公式法、累加法、累乘法...
  5. Keepalived+Nginx实现高可用负载均衡集群
  6. java socket如何请求485协议_javaSE第十五部分 网络编程(1)Socket和ServerSocket
  7. erlang之三种socket消息循环
  8. Java Web(八) MVC和三层架构
  9. 38. Python批量翻译英语单词
  10. phpQuery占用过多内存的解决方法
  11. 企业数据总线(ESB)和注册服务管理(dubbo)的区别{{1033}}
  12. mysql 查询每个班级的前三名
  13. Hibernate必须掌握的知识
  14. windows操作系统服务器 网卡速度关联项
  15. 苹果手机10秒解除锁屏_苹果密码忘了不想刷机怎么办_苹果手机10秒解除锁屏
  16. jquery判断日期格式
  17. 舌尖上的中国第二季整理笔记
  18. 夜曲 文/江湖一劍客
  19. Oracle数据库原理
  20. 如何批量给文件重命名?

热门文章

  1. 嵌入式Linux截图工具gsnap移植与分析【转】
  2. 社会资源全整合 视频监控全覆盖
  3. 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:...
  4. ***HTML +CSS 总结与归纳
  5. js querySelector与getElementById
  6. 性能测试学习笔记-如何管理loadrunner的临时文件
  7. BlueHost怎样创建MySQL数据库
  8. AD、DHCP、DNS概念整理
  9. C#.Net 扩展方法
  10. 商友ERP系统---结算方面几项事宜