二叉树遍历的递归、非递归方法(前序、中序、后序,层序)——Java实现
1. 二叉树的前序遍历(深度优先遍历)
二叉树的节点定义
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x;}
}
递归实现:
public class MyTest {static ArrayList<Integer> list = new ArrayList<>();public int fisrtTraversal(TreeNode node) {// 判断该节点是否存在if (node == null) {return 0;}list.add(node.val);firstTraversal(node.left);firstTraversal(node.right);return 0;}
}
非递归实现:
public class MyTest {public ArrayList<Integer> fisrtTraversal(TreeNode root) {ArrayList<Integer> list = new ArrayList<>();if (root == null) {return list;}Stack<TreeNode> stack = new Stack<>();stack.add(root);TreeNode node = null;while (!stack.isEmpty()) {node = stack.pop();list.add(node.val);if (node.left != null) {stack.add(node.left);}if (node.right != null) {stack.add(node.right);}}return list;}
}
2. 二叉树的中序遍历
递归实现:
public class MyTest {static ArrayList<Integer> list = new ArrayList<>();public int midTraversal(TreeNode node) {// 判断该节点是否存在if (node == null) {return 0;}firstTraversal(node.left);list.add(node.val);firstTraversal(node.right);return 0;}
}
非递归实现:
利用栈实现。如图所示,向左斜下方向依次入栈,直达叶子节点;然后出栈两个(本身与其父节点)。
执行过程:
入栈:1、2、4 出栈:4、2
入栈:5 出栈:5
入栈:3、6 出栈:6、2
入栈:7 出栈:7
最终的中序遍历结果为:4、2、5、6、2、7
public class MyTest {public ArrayList<Integer> midTraversal(TreeNode root) {ArrayList<Integer> list = new ArrayList<>();if (root == null) {return list}Stack<TreeNode> stack = new Stack<>();stack.add(root);TreeNode node = root;while (!stack.isEmpty()) {if ((node != null) && (node.left != null)) {stack.add(node.left);node = node.left;} else {node = stack.pop();list.add(node.val);if (!stack.isEmpty()) {node = stack.pop();list.add(node.val);}node = node.right;}}return list;}
}
3. 二叉树的后序遍历
递归实现:
public class MyTest {static ArrayList<Integer> list = new ArrayList<>();public int lastTraversal(TreeNode node) {// 判断该节点是否存在if (node == null) {return 0;}firstTraversal(node.left);firstTraversal(node.right);list.add(node.val);return 0;}
}
非递归实现:
用两个栈(Stack1、Stack2)来实现。
将node压入Stack1,取出来把node的左右子节点,都压进Stack2;再把node压入Stack2。这样循环下去,Stack2的出栈顺序就是后续遍历。
public class MyTest {public ArrayList<Integer> lastTraversal(TreeNode root) {ArrayList<Integer> list = new ArrayList<>();if (root == null) {return list;}Stack<TreeNode> stack1 = new Stack<>();Stack<TreeNode> stack2 = new Stack<>();stack1.add(root);TreeNode node = null;while (!stack1.isEmpty()) {node = stack1.pop();if (node.left != null) {stack1.add(node.left);}if (node.right != null) {stack1.add(node.right);}stack2.add(node);}while (!stack2.isEmpty()) {list.add(stack2.pop().val);}return list;}
}
4. 二叉树的广度优先遍历(层次遍历)
非递归实现(利用队列):
public class MyTest {public ArrayList<Integer> levelTraversal(TreeNode root) {ArrayList<Integer> list = new ArrayList<>();if (root == null) {return list;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);TreeNode node = null;while (!queue.isEmpty()) {node = queue.poll();list.offer(node.val);if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}return list;}
}
二叉树遍历的递归、非递归方法(前序、中序、后序,层序)——Java实现相关推荐
- 数据结构(六)二叉树的遍历(递归非递归方法)
数据结构(六)二叉树的遍历(递归非递归方法) 一.递归方法 1.先序遍历 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrde ...
- 数据结构(七)图的遍历(递归非递归方法)
图的遍历(递归非递归方法) #include<iostream> #include<stdio.h> #include<stack> #include<que ...
- 二叉树遍历【递归非递归】
遍历代码 递归法 public class BinaryTreeTest {public static void main(String[] args) {System.out.println(&qu ...
- 【算法笔记】二叉树遍历模板递归+非递归
目录 前序遍历 递归版本 迭代版本 中序遍历 递归版本 迭代版本 后序遍历 递归版本 迭代版本 二叉树层序遍历 栈的定义 语法注意: Deque<Integer> stack = new ...
- 二叉树中序遍历(递归+非递归)Java
目录 一.结构 二.遍历二叉树 1.中序遍历(递归) 代码 图解 2.中序遍历(非递归) 代码 图解 一.结构 二.遍历二叉树 这块内容是二叉树最核心的部分.不但要掌握七种遍历的写法,前.中.后序的递 ...
- 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法
本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...
- 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)
前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...
- 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++
a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...
- C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...
最新文章
- golang连接mysql报错:this authentication plugin is not supported 解决方案
- CSS 实现图片横向拖动
- 洛谷——P1183 多边形的面积
- 文档丨Oracle 20c 概念手册
- jenkins 读取json文件_使用插件轻松获取jenkins构建数据
- 《高可用架构·中国初创故事(第3期)》一2.5 指导
- linux中文语音合成,Linux系统下高质量(微软)中、英文语音合成TTS的安装
- 关于Google Android平台的ClockworkMod Recovery恢复模式
- cmd 终端快速查看自己的ip地址
- 服务器中tomcat内存溢出配置文件修改
- densepose的IUV图像I通道数字与身体部分对应关系
- Java基础教程笔记
- read函数和write函数的使用
- bug:点击element的级联选择器 级联面板偶尔不显示 触发条件未知
- 票啦啦--手机购电影票
- 华为机试真题 C++ 实现【叠积木】
- Caustics焦散
- iphone13预计上市时间 苹果13多少钱
- Spring4 介绍
- 金融科技的下一战场:从金融普惠到技术普惠