二叉树的遍历

二叉树遍历的路径 : 前中后序二叉树遍历的路劲是一样的!
前序 : 根 -左子树-右子树 在非递归的视角: 在第一次到达这个节点就直接操作这个节点!
中序 : 左子树-根-右子树 在非递归的视角: 在第二次到达这个节点再操作这个节点!
后续 : 左子树-右子树-根 在非递归的视角: 在第三次到达这个节点再操作这个节点!

前序

// 非递归实现二叉树前序遍历  // 具体过程 // 为了先 左 再 右 // 所以先放右 再放左  // 模拟递归额过程 // 先将根节点入栈 // 再将栈顶pop() 并判断 抛出节点 左右子节点是否为空 // 如果 1. 右子节点不为空 将右子节点入栈 //       2.如果左子节点不为空 将左子节点入栈// 循环上面三步 直到栈为空 ;public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if(root == null) return ans;stack.push(root);while(!stack.isEmpty()){TreeNode cur = stack.pop();ans.add(cur.val); // 在第一次访问到当前节点就直接把当前节点遍历if(cur.right != null){stack.push(cur.right);}if(cur.left != null){stack.push(cur.left);}}return ans;}

中序

 // 左 根 右 // 先循环向左 将所有左边的入栈 (直到左子树为 null )// 依次出栈访问 并检查其右子树为不为空 不为空就入栈 继续向左找// 循环前两步public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if(root == null) return ans;while(true){while(root != null){stack.push(root);root = root.left;}// 先将最左左边的元素 确定到栈顶 if(stack.isEmpty()){break;}// 抛出元时要判断栈是否为空 为空 则表示遍历完成root = stack.pop(); // 将最左节点抛出 ans.add(root.val);root = root.right;}return ans;}

后序

// 左 右 根// 非递归后序遍历 // 类似于中序遍历 // 1. 循环访问将左子树入栈 (直到最左边 )// 2. 判断 栈顶元素是否可以被访问 条件 1: 栈顶元素 没有 左子树 可以被访问 2: 栈顶元素的上一个被访问的元素是 栈顶元素的右子树 可以访问 // 3. 循环从 栈顶元素的右子树开始 goto 1; public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();if(root == null) return ans;TreeNode cur = root;TreeNode pre = null;while(true){while(cur != null){stack.push(cur);cur = cur.left;}if(stack.isEmpty()){break;}TreeNode top = stack.peek();if(top.right == null || pre == top.right){stack.pop();pre = top;ans.add(top.val);}else cur = top.right;}return ans;}

二叉树的非递归遍历(java)相关推荐

  1. 二叉树的非递归遍历(java版)

    二叉树的递归遍历比较简单,这里就不聊了.今天主要聊聊二叉树的非递归遍历,主要借助于"栈"后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历. 1. ...

  2. 刷题:二叉树的非递归遍历方式

    二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...

  3. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

  4. 二叉树的非递归遍历(统一的模板)

    二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...

  5. 数据结构-二叉树的非递归遍历

    前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...

  6. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  7. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  8. 6-9 二叉树的非递归遍历 (20 分)

    ** 6-9 二叉树的非递归遍历 (20 分) ** 本题要求用非递归的方法实现对给定二叉树的 3 种遍历. 函数接口定义: void InorderTraversal( BinTree BT ); ...

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

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

最新文章

  1. 一步步带你详解JVM性能调优
  2. linux查看设备内存代码,Linux下内存查看命令(示例代码)
  3. Struts2中导入外部xml文件出现Included file cannot be found错误!
  4. Spring Boot发布2.6.2、2.5.8:升级log4j2到2.17.0
  5. esp8266单片机透传_ESP8266通过MQTT接入Home Assistant
  6. 视频剪辑软件到底哪个功能强?容易上手并且不要钱的?
  7. [leetcode]100.Same Tree
  8. tp3.2 执行原生sql
  9. 程序员写文档工具推荐,让你爱上写文档!
  10. PPT 下载 | 神策数据徐美玲:标签体系应用及设计思路
  11. APP抓包工具——Fiddler
  12. PS教程:通道抠图美女发丝
  13. 我的全栈之路-Java基础之Java企业级项目开发环境搭建
  14. spire.office for.net 的Crack
  15. 再次深入分析不可重入函数---请小心使用localtime函数
  16. Spring中的事务控制(Transacion Management with Spring)
  17. RFID服装资产管理-新导智能
  18. 牛客编程巅峰赛S1第3场 - 黄金钻石 A.简单题 B.dfs C.并查集
  19. 数码数字字体_数码相机的分类及单反数码相机、卡片数码相机的介绍
  20. 刘海洋《LaTex入门》学习笔记4

热门文章

  1. SpringMVC的执行流程
  2. OpenJudge NOI题库1.1答案
  3. 基于Android的仿美团外卖系统设计与实现 文档+源码+视频
  4. 【工程师有空了】安信可ESP32之TOUCH触摸传感器的花式应用--一个IO识别多个触摸按键
  5. Nokia 5110字模提取
  6. linux驱动开发:触摸屏的认识(FT5x06 IC的分析)
  7. 黑马程序员JAVA 教程--基础语法
  8. 一、使用vue创建项目的详细步骤
  9. allegro学习之总结pcb设计流程
  10. random和urandom的区别