java二叉树原理_史上最全二叉树遍历详解(Java实现,原理相同)
二叉树遍历方法合集:
最近在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实现,原理相同)相关推荐
- 排序算法java 简书_史上最全经典排序算法总结(Java实现)
查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...
- 接地脚是什么意思_史上最全的接地系统详解,值得收藏
接地一直是很多弱电朋友的难点,主要还是做接地的工程不多,这方面一直陆陆续续的朋友在讨论过,那么今天我们一起来对接地进行详细了解. 有人问:为什么回路电流走零线不走地线,而漏电流走地线不走零线,零线地线 ...
- 史上最全 JVM 大全详解、java 程序员细节到极致的一次,魔鬼
前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...
- 史上最全 JVM 大全详解!java 程序员细节到极致的一次,魔鬼
前言 作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识. JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准.而大多数人可能没有对 JVM 的实际 ...
- 史上最全数据库中间件详解
导读:本文详细介绍了中间件,主要从数据库拆分过程及挑战.主流数据库中间件设计方案.读写分离核心要点.分库分表核心要点展开说明. 1. 数据库拆分过程及挑战 垂直拆分.读写分离.分库分表(水平拆分).每 ...
- 易鑫集团Java面试题_史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)...
前言:最近老是收到小伙伴的私信问我能不能帮忙整理出一份JVM相关的面试题出来,说自己在大厂去面试的时候这一块问的是特别多的,每次自己学的时候每次都学不到重点去.这不他来了,一份详细的JVM面试真题给大 ...
- 史上最全测试流程详解----超详细
前言----- 对于测试流程基本很多做过测试的大牛,小哥哥,小姐姐都能说出个十之八九,但是对于细节,可能还需要一些整理文件,这不,我整理了一些测试的全部流程,希望能给大家带来帮助,有不妥的地方,请大家 ...
- java springmvc 教程_史上最全最强SpringMVC详细示例实战教程
SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...
- java mvc学习_史上最全的SpringMVC学习笔记
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 springmvc o ...
最新文章
- PHP函数学习nl2br(),strlen(),mb_strlen()
- engine中调整Element的上下显示顺序(遮盖)
- Zookeeper (一)集群简单搭建
- 骂骂咧咧的 fastreport 数据隔行换色
- java虚拟机规范这本书怎么样_JVM规范系列开篇:为什么要读JVM规范?
- Linux调优(文件系统)
- Nagios---NRPE
- Bootstrap 3 响应式上传图片,时间拾取器和表单认证 Fileinput, Date/Time Pickr, Validator...
- jquery实现上下左右键盘监听_基于 jQuery 实现键盘事件监听控件
- Facebook 发布全新 JavaScript 引擎:Hermes! | CSDN博文精选
- 利用excel和word批量制作标签
- 如何重置网络?如何激活产品?
- cocoscreator的Bundle加载问题
- 海康威视web插件层级遮挡问题,仅供参考
- 从记账软件看工具类APP的存量运营之道
- vue中el-dialog弹窗关闭,子组件控制父组件
- JavaScript面试题整理汇总
- AcWing417. 不高兴的津津
- 活动h5页面倒计时效果
- atk-paj7620手势传感器驱动
热门文章
- 如何查看linux的资源,Linux系统资源查看(示例代码)
- 容器的进程与namespace、rootfs
- 笔记-多项式相关操作
- 关于电商网站购物车功能如何与登录账号相关联的一点想法
- js学习总结----简单的动画库封装tween.js
- 【JZOJ3885】【长郡NOIP2014模拟10.22】搞笑的代码
- 安全基础知识 最强0到33600端口详解(5)
- apirestful php自动测试,PHP实现自动识别Restful API的返回内容类型
- (107)FPGA面试题-Verilog编写200ns异步/同步低有效复位激励
- (83)FPGA仿真完成激励(finish)