二叉树的遍历

1:前序遍历

  • 在这个图中,我们把1 ,2 ,4三个节点压入了栈中

    • 在压入栈的时候,直接读取
  • 然后我们把2弹出来
    • 判断右边是不是为空,如果不为空

      • 按照第一步的方法,以该节点为根节点,把左子节点压入栈中,压入的时候进行读取
    • 如果为空,就什么都不做
#include<iostream>
#include<vector>
#include<stack>using namespace std;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) {vector<int> res;if(root == nullptr) return res;stack<TreeNode*> mystack;while(root != nullptr){res.push_back(root->val);mystack.push(root);root = root->left;}while(!mystack.empty()){TreeNode* temp = mystack.top();mystack.pop();if(temp->right != nullptr){TreeNode* newNode = temp->right;cout << newNode->val;while(newNode != nullptr){res.push_back(newNode->val);mystack.push(newNode);newNode = newNode->left;}}}for(int i = 0; i < res.size(); i++){cout << res[i] << " ";}cout << endl;return res;}
};

2:中序遍历

  • 结果是 4 2 6 5 7 1 3
  • 将左子节点压入栈中,1,2,4
  • 将他们弹出来,然后弹出来之后进行访问
// 在前序的基础上,压入的时候不进行遍历,弹出的时候进行遍历

3:后续遍历

  • 结果是4 6 7 5 2 3 1
  • 我们还是压入左子树
  • 弹出了四
    • 此时判断右子树没有,我们遍历4
  • 弹出了二
    • 此时右子树是有的,所以我们将5 和 6 进行弹入
  • 弹出6,此时可以遍历
  • 弹出5,此时右子树有7,什么时候进行打印呢??

——————————————————学习——————————————

  • 栈和空的,root 不为空
  • 将1,2,4压入到栈中
  • 将4弹出来
    • 判断4的右边是不是为空,或者是是不是上次的prev,为空,直接读取,将prev设置为4,root 设置为null
  • 将2弹出来
    • 判断2的右边不为空,

      • 将2探进去,把5,6探进去
      • 把6 弹出来
      • 把5弹出来
      • 右边的元素不是prev,所以要再弹出来

#include<iostream>
#include<vector>
#include<stack>using namespace std;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> postorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode *> mystack;TreeNode* prev;while(root != nullptr || !mystack.empty()){while(root != nullptr){mystack.push(root);root = root->left;}root = mystack.top();mystack.pop();if(root->right == nullptr or root->right == prev){res.push_back(root->val);prev = root;root = nullptr;}else{mystack.push(root);root = root->right;}}return res;}
};

二叉树的遍历(前,中,后)相关推荐

  1. python实现二叉树非递归前中后序遍历

    python实现二叉树非递归前中后层序遍历 二叉树是数据结构中重要的一部分,本文简单介绍用python实现二叉树的前中后序遍历,包括递归和非递归思路算法. # -*- 二叉树 begin -*- # ...

  2. 二叉树前中后序遍历+刷题【中】【数据结构/初阶/C语言实现】

    文章目录 1. 二叉树基础操作 1.1 二叉树遍历 1.1.1 前序遍历 前序遍历(Pre-Order Traversal) 1.1.2 中序遍历 中序遍历(In-Order Traversal) 1 ...

  3. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  4. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  5. 二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法

    关于二叉树的前序遍历(preoder).中序遍历(inorder)和后序遍历(postorder),实际上只需要记住:左子节点一定在右子节点的左边(左右),所谓前中后序遍历就是根节点的位置不同,前序是 ...

  6. [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

    [问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...

  7. 二叉树的层序遍历和前中后序遍历代码 迭代/递归

    二叉树的层序遍历和前中后序遍历代码 迭代/递归 只记录代码.思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/mast ...

  8. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  9. 二叉树非递归dfs——简单思路搞定前中后序遍历

    前言:相信很多同学都被二叉树非递归dfs的前中后序遍历方法弄的头疼.网上的答案,什么前中后序遍历各有一套写法,还有什么一个栈的写法,两个栈的写法.看起来能理解,一闭眼自己写都记不住.今天介绍一种用一种 ...

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

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

最新文章

  1. 英特尔11代 16G内存笔记本,为你免费包邮到家
  2. python怎么加载图片-如何用python获取图像
  3. linux下模拟cc攻击命令,介绍几种用Linux命令判断CC攻击的方法
  4. K8s 工程师必懂的 10 种 Ingress 控制器
  5. C++实现链栈的基本操作
  6. unity3d collider自动调整大小_自动网格组合建模工具Unity游戏素材资源
  7. python技术文档_Python技术文档最佳实践
  8. sourcetree克隆一直不成功_Git神器| SourceTree安装使用教程
  9. QT程序在windows下部署发布
  10. java.net.UnknownHostException 未知的名称或服务
  11. java用不起_Java,泛型不起作用
  12. SVN合并分支到主干(简单易懂)
  13. VM296:1 Uncaught SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse (anonymous)
  14. 拜年神器php,Biu神器安卓版
  15. 阿里P6级别Java程序员月薪多少?阿里认证员工给出答案
  16. k43.第十七章 K8s运维篇-DevOps 持续集成 持续部署 (三)
  17. 银川清华计算机技术培训,银川有没有本地IT技能培训?
  18. ei指什么_SCI、EI分别是什么意思
  19. 【2019-09-04】恐惧就是进化的暗示
  20. python保存文件的几种方式

热门文章

  1. python2和pytho3切换_python2和pytho3切换_Python2和Python3共存安装
  2. const类型限定符
  3. twsited快速基础
  4. 【机器学习】朴素贝叶斯代码练习
  5. 复现经典:《统计学习方法》​第17章 潜在语义分析
  6. 【零基础入门数据挖掘】-特征工程
  7. wuhan2020开源项目协作流程发布 征集专家人士
  8. 一文通俗了解对抗生成网络(GAN)核心思想
  9. 聚类 | 超详细的性能度量和相似度方法总结
  10. zkdoctor安装部署