二叉树遍历方法合集:

最近在LeetCode力扣上刷数据结构的二叉树合集,遇到的二叉树遍历方法,于是想理解透彻。本文讲解了二叉树遍历的四种方法,前、中。后序遍历。

对应题目:

94.二叉树的中序遍历

144.二叉树的前序遍历

145.二叉树的后序遍历

102.二叉树的层序遍历

只要参考任意一种解法的代码,将其中的输出代码替换成添加数组元素即可。

我的本意是想让大家能深入的理解二叉树遍历的过程,之后完成这三道题和其它二叉树遍历的题目能够感觉轻松一点。

递归解法

递归解法是比较常用而且容易理解的方法,只要理解了思路就能够很好的去使用他。

**比如前序遍历:**前序遍历的递归方法就是:根、左、右,先打印根节点,只有再去寻找他的左子树,左子树找到末尾的时候返回再找又指数,直到完成。

下面放代码:

前序遍历

public static void PreOrderRecur(TreeNode root){

if(root == null) return;

System.out.println(root.data);

PreorderRecur(root.left);

PreorderRecur(root.right);

}

中序遍历

public static void InOrderRecur(TreeNode root){

if(root == null) return;

InorderRecur(root.left);

System.out.println(root.data);

InorderRecur(root.right);

}

后序遍历

public static void PostOrderRecur(TreeNode root){

if(root == null) return;

PostorderRecur(root.left);

PostorderRecur(root.right);

System.out.println(root.data);

}

观察可以发现,递归的实现其实只是输出根节点的位置不一样,并没有很大的不同。

迭代解法

本质上是在模拟递归,因为在递归的过程中使用了系统栈,所以在迭代的解法中常用Stack来模拟系统栈。注意栈的先进后出顺序,输出出来的就是倒序打印。

前序遍历

⼆叉树的前序遍历顺序是根-左-右。我们可以采⽤⼀个栈来辅助,我们把先序遍历的结果放到⼀个ArrayList 容器中作为返回值,具体步骤如下:

1、把⼆叉树的根节点 root 放进栈。

2、如果栈不为空,从栈中取出⼀个节点,把该节点放⼊容器的尾部;如果该节点的右⼦树不为空,则

把有节点放⼊栈;如果该节点的左⼦树不为空,则把左⼦树放⼊栈中。

3、⼀直重复步骤 2 ,直到栈为空,此时遍历结束,代码如下:

static List PreOrderTraversal(TreeNode root){

List(Interger) result = new ArrayList<>();

Stack stack = new Stack();

if(root == null) return result;

stack.push(root);//首先把根节点放入栈中

while(!stack.isEmpty(){

//当栈中不为空的时候,执行以下操作

TreeNode temp = stack.pop();//取出栈中的节点,用一个临时变量保存

result.add(temp.val);//将变量的值加入结果队列中

if(tmp.right!=null)

stack.push(root.right);//如果该节点的右⼦树不为空,则把有节点放⼊栈

if(tmp.left!=null)

stack.push(root.left);//如果该节点的左⼦树不为空,则把左⼦树放⼊栈中。

}

return result;

}

中序遍历

⼆叉树的中序遍历顺序是左-根-右。我们可以采⽤⼀个栈来辅助,我们把中序遍历的结果放到⼀个

ArrayList 容器中作为返回值,具体步骤如下:

1、进⼊ while 循环,接着把根节点及其所有左⼦节点放⼊栈中。

2、从栈中取出⼀个节点,把该节点放⼊容器的尾部;如果该节点的右⼦节点不为空,则把右⼦节点及

其右⼦节点的所有左⼦节点放⼊队列。

3、⼀直重复步骤 2 ,直到栈为空并且当前节点也为空则退出循环。

可能看解释反⽽有点乱,直接看代码吧,配合代码就容易懂了

代码如下:

public List InOrderTraversal(TreeNode root){

List res = new ArrayList<>();

Stack stack = new Stack<>();

while (root != null || !stack.isEmpty())

{

if(root != null){

stack.push(root);

root=root.left;

}

else{

root = stack.pop();

res.add(root.data);

root=root.right;

}

}

return res;

}

后续遍历

宽搜+逆序输出 = 后序遍历

⼆叉树的后序遍历顺序是左-右-根。我们可以采⽤⼀个栈来辅助,不过它和前序遍历以及中序遍历还是有点区别的,我们把后序遍历的结果放到⼀个 LinkedList 容器中作为返回值,具体步骤如下:

1、把⼆叉树的根节点 root 放进栈。

2、如果栈不为空,从栈中取出⼀个节点,把该节点插⼊到容器的头部。;如果该节点的左⼦树不为

空,则把该左⼦树放⼊栈中;如果该节点的右⼦树不为空,则把右⼦树放⼊栈中。,

注意,之前的前序遍历和中序遍历,我们都是⽤ ArrayList 容器,并且是把节点插⼊到容器的尾部,这

就是后序遍历的不同点。

3、⼀直重复步骤 2 ,直到栈为空,此时遍历结束

代码如下:

public List postOderTraversal(TreeNode root) {

LinkedList res = new LinkedList<>();// 注意,采⽤链表

Stack stack = new Stack<>();

if(root == null)

return res;

stack.push(root);

while (!stack.isEmpty()) {

TreeNode tmp = stack.pop();// 注意,是放在第⼀个位置

res.addFirst(tmp.val);

if(tmp.left != null)

stack.push(tmp.left);

if(tmp.right != null)

stack.push(tmp.right);

}

return res;

}

java二叉树原理_史上最全二叉树遍历详解(Java实现,原理相同)相关推荐

  1. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

  2. 接地脚是什么意思_史上最全的接地系统详解,值得收藏

    接地一直是很多弱电朋友的难点,主要还是做接地的工程不多,这方面一直陆陆续续的朋友在讨论过,那么今天我们一起来对接地进行详细了解. 有人问:为什么回路电流走零线不走地线,而漏电流走地线不走零线,零线地线 ...

  3. 史上最全 JVM 大全详解、java 程序员细节到极致的一次,魔鬼

    前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...

  4. 史上最全 JVM 大全详解!java 程序员细节到极致的一次,魔鬼

    前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...

  5. 史上最全数据库中间件详解

    导读:本文详细介绍了中间件,主要从数据库拆分过程及挑战.主流数据库中间件设计方案.读写分离核心要点.分库分表核心要点展开说明. 1. 数据库拆分过程及挑战 垂直拆分.读写分离.分库分表(水平拆分).每 ...

  6. 易鑫集团Java面试题_史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)...

    前言:最近老是收到小伙伴的私信问我能不能帮忙整理出一份JVM相关的面试题出来,说自己在大厂去面试的时候这一块问的是特别多的,每次自己学的时候每次都学不到重点去.这不他来了,一份详细的JVM面试真题给大 ...

  7. 史上最全测试流程详解----超详细

    前言----- 对于测试流程基本很多做过测试的大牛,小哥哥,小姐姐都能说出个十之八九,但是对于细节,可能还需要一些整理文件,这不,我整理了一些测试的全部流程,希望能给大家带来帮助,有不妥的地方,请大家 ...

  8. java springmvc 教程_史上最全最强SpringMVC详细示例实战教程

    SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

  9. java mvc学习_史上最全的SpringMVC学习笔记

    一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 springmvc o ...

最新文章

  1. PHP函数学习nl2br(),strlen(),mb_strlen()
  2. engine中调整Element的上下显示顺序(遮盖)
  3. Zookeeper (一)集群简单搭建
  4. 骂骂咧咧的 fastreport 数据隔行换色
  5. java虚拟机规范这本书怎么样_JVM规范系列开篇:为什么要读JVM规范?
  6. Linux调优(文件系统)
  7. Nagios---NRPE
  8. Bootstrap 3 响应式上传图片,时间拾取器和表单认证 Fileinput, Date/Time Pickr, Validator...
  9. jquery实现上下左右键盘监听_基于 jQuery 实现键盘事件监听控件
  10. Facebook 发布全新 JavaScript 引擎:Hermes! | CSDN博文精选
  11. 利用excel和word批量制作标签
  12. 如何重置网络?如何激活产品?
  13. cocoscreator的Bundle加载问题
  14. 海康威视web插件层级遮挡问题,仅供参考
  15. 从记账软件看工具类APP的存量运营之道
  16. vue中el-dialog弹窗关闭,子组件控制父组件
  17. JavaScript面试题整理汇总
  18. AcWing417. 不高兴的津津
  19. 活动h5页面倒计时效果
  20. atk-paj7620手势传感器驱动

热门文章

  1. 如何查看linux的资源,Linux系统资源查看(示例代码)
  2. 容器的进程与namespace、rootfs
  3. 笔记-多项式相关操作
  4. 关于电商网站购物车功能如何与登录账号相关联的一点想法
  5. js学习总结----简单的动画库封装tween.js
  6. 【JZOJ3885】【长郡NOIP2014模拟10.22】搞笑的代码
  7. 安全基础知识 最强0到33600端口详解(5)
  8. apirestful php自动测试,PHP实现自动识别Restful API的返回内容类型
  9. (107)FPGA面试题-Verilog编写200ns异步/同步低有效复位激励
  10. (83)FPGA仿真完成激励(finish)