一、先搞懂原理

我们用前序递归作为例子:

这个递归大概应该都没问题!!那么我们怎么模拟系统栈呢?大餐来了,例如我们要遍历这个树

我们先要将1的根节点传入我们前序遍历的函数,这一步简称"go 1",进入后,我们就会把函数里的这三条命令压入系统栈,我们把输出简称为"print ";

取出栈顶,然后就输出1的值了,然后1的左节点进入函数就是"go 2",取栈顶,2进入函数,又是三个行,如下面:

然后输出2节点的值,继续去2的左节点,但是2没有左节点就直接返回了。什么都没做。然后一直弹出,直到1的右节点。

然后1的左节点进入函数,又是三个如图:

输出3的值,3的左右节点没有,栈为空,目前为止就打印出来完了。

我们进行了这些操作,始终离不开"go"、"print"这两个操作。因此我们把节点的操作和节点弄成一个类。

    public static class Commond{private String desc;private TreeNode node;public Commond(String desc, TreeNode node){this.desc = desc;this.node = node;}}

根据不同的行为,我们进行不同的操作!

二、非递归的前序

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<Commond> stack=new Stack<>();if(root != null) stack.push(new Commond("go", root));else return res;while(!stack.empty()){Commond temp = stack.pop();if(temp.desc.equals("go")){if(temp.node.right != null)stack.push(new Commond("go",temp.node.right));if(temp.node.left != null )stack.push(new Commond("go",temp.node.left));stack.push(new Commond("print",temp.node));}else{res.add(temp.node.val);}}return res;}public static class Commond{private String desc;private TreeNode node;public Commond(String desc, TreeNode node){this.desc = desc;this.node = node;}}
}

三、非递归的中序

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<Commond> stack=new Stack<>();if(root != null) stack.push(new Commond("go", root));else return res;while(!stack.empty()){Commond temp = stack.pop();if(temp.desc.equals("go")){if(temp.node.right != null)stack.push(new Commond("go",temp.node.right));stack.push(new Commond("print",temp.node));if(temp.node.left != null )stack.push(new Commond("go",temp.node.left));}else{res.add(temp.node.val);}}return res;}public static class Commond{private String desc;private TreeNode node;public Commond(String desc, TreeNode node){this.desc = desc;this.node = node;}}
}

四、非递归的后序

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<Commond> stack=new Stack<>();if(root != null) stack.push(new Commond("go", root));else return res;while(!stack.empty()){Commond temp = stack.pop();if(temp.desc.equals("go")){stack.push(new Commond("print",temp.node));if(temp.node.right != null)stack.push(new Commond("go",temp.node.right));if(temp.node.left != null )stack.push(new Commond("go",temp.node.left));}else{res.add(temp.node.val);}}return res;}public static class Commond{private String desc;private TreeNode node;public Commond(String desc, TreeNode node){this.desc = desc;this.node = node;}}
}

五、总结

根据这三段代码,我们可以清晰看出我们只需要更换"go","print"的描述顺序,就可以实现前中后序的遍历了。是不是更简单了,更容易理解了。

最全面经及答案(已700+收藏量):

(5条消息) 2021年5月最新面经答案总结(Java基础、数据库、JVM、计网、计操、集合、多线程、Spring)_万小猿的博客-CSDN博客

超级易懂的非递归实现二叉树三种遍历(与网上都不一样)相关推荐

  1. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

  2. 非递归实现二叉树结点的遍历

    非递归实现二叉树结点的遍历 考研复习时遇到了二叉树遍历的考点,于是把它按照自己的思路整理出来,可能存在些许错误 ,但大致思想应该没问题. 1.先序遍历 思想:先序遍历的处理顺序是根.左.右,如果我们把 ...

  3. 二叉树三种遍历方式的非递归实现

    树的递归实现方式很简单,下面介绍三种遍历的非递归实现. 树的遍历有个特点,那就是在处理具体问题时,绝大多数情况下是在当前循环.或函数(或是子树)的根节点来处理的,能够注意到当前根节点是如何从上个根节点 ...

  4. python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  5. 一文弄懂二叉树三种遍历

    作者 | 菠了个菜 责编 | 屠敏 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 在二叉树的遍历中存在三种较为常用的遍历方式:前序遍历.中 ...

  6. 二叉树三种遍历(递归以及非递归实现)

    package com.shiyeqiang.tree;import java.util.Stack;public class BiTree {public static void main(Stri ...

  7. 二叉树三种遍历方式,先序、中序、后序

    二叉树遍历方式分为三种:先序,中序和后序. 可以以根节点的位置为参考来记遍历方式,在第一个为先序,中间为中序,最后为后序: 即:先序: 根左右:中序:左根右:后序:左右根. 借个图: 之前看过一个视频 ...

  8. 144. Binary Tree Preorder Traversal(非递归实现二叉树的前序遍历)

    Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...

  9. Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  10. 后序遍历的非递归算法python_Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

最新文章

  1. 什么时候是找工作的最佳时期? | 原力计划
  2. 一个帮忙画logo的网站,这个我没试过,不过我觉得淘宝更便宜一些吧
  3. 6.2 基本操作与存储
  4. (转)网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)...
  5. k8s中流量分离以及资源隔离实战
  6. 熊猫tv新功能介绍_熊猫简单介绍
  7. discuzX 帖子 有的图片没输出 [attach]12323[/attach]的解决办法
  8. uos配置 java 环境变量_CentOS 7.3 环境配置java和tomcat开机启动
  9. 【Django】ImportError: cannot import name 'execute_manager'
  10. 不用StringBuilder!Java8的StringJoiner,也很香!
  11. iWebOffice一些相关
  12. Yandex安装第三方crx插件的方法
  13. 阿里笔试题解(2020.4.17场)
  14. 用 Python 爬取网易严选妹子内衣信息,探究妹纸们的偏好
  15. visio付款流程图_visio画程序流程图(转)
  16. SpringDataJPA使用Specification动态查询和分页
  17. Android App性能测试| 流量、电量、弱网环境
  18. 如何使用 Linux 内核定时器
  19. Java基础系列(三十):局部内部类
  20. “ 试题管理系统”需求分析报告

热门文章

  1. Oracle中记录被锁解锁方法
  2. flash物理引擎应用:FisixObject类(1)
  3. family album U.S.A 02
  4. mysql 书名_深入理解MySQL
  5. 冒泡排序c++_学习笔记-详解冒泡排序
  6. andpods授权码订单号分享_Axure 9.0学生免费授权申请详细步骤
  7. python 实现 画图器_python实现画图工具
  8. kill -9 杀不死的进程处理办法
  9. c语言 分开整数各个数位
  10. linux 共享内存管理,什么是物理/虚拟/共享内存——Linux内存管理小结一