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. 数据结构(六)二叉树的遍历(递归非递归方法)

    数据结构(六)二叉树的遍历(递归非递归方法) 一.递归方法 1.先序遍历 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrde ...

  2. 数据结构(七)图的遍历(递归非递归方法)

    图的遍历(递归非递归方法) #include<iostream> #include<stdio.h> #include<stack> #include<que ...

  3. 二叉树遍历【递归非递归】

    遍历代码 递归法 public class BinaryTreeTest {public static void main(String[] args) {System.out.println(&qu ...

  4. 【算法笔记】二叉树遍历模板递归+非递归

    目录 前序遍历 递归版本 迭代版本 中序遍历 递归版本 迭代版本 后序遍历 递归版本 迭代版本 二叉树层序遍历 栈的定义  语法注意: Deque<Integer> stack = new ...

  5. 二叉树中序遍历(递归+非递归)Java

    目录 一.结构 二.遍历二叉树 1.中序遍历(递归) 代码 图解 2.中序遍历(非递归) 代码 图解 一.结构 二.遍历二叉树 这块内容是二叉树最核心的部分.不但要掌握七种遍历的写法,前.中.后序的递 ...

  6. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  7. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

  8. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  9. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

  10. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

最新文章

  1. golang连接mysql报错:this authentication plugin is not supported 解决方案
  2. CSS 实现图片横向拖动
  3. 洛谷——P1183 多边形的面积
  4. 文档丨Oracle 20c 概念手册
  5. jenkins 读取json文件_使用插件轻松获取jenkins构建数据
  6. 《高可用架构·中国初创故事(第3期)》一2.5 指导
  7. linux中文语音合成,Linux系统下高质量(微软)中、英文语音合成TTS的安装
  8. 关于Google Android平台的ClockworkMod Recovery恢复模式
  9. cmd 终端快速查看自己的ip地址
  10. 服务器中tomcat内存溢出配置文件修改
  11. densepose的IUV图像I通道数字与身体部分对应关系
  12. Java基础教程笔记
  13. read函数和write函数的使用
  14. bug:点击element的级联选择器 级联面板偶尔不显示 触发条件未知
  15. 票啦啦--手机购电影票
  16. 华为机试真题 C++ 实现【叠积木】
  17. Caustics焦散
  18. iphone13预计上市时间 苹果13多少钱
  19. Spring4 介绍
  20. 金融科技的下一战场:从金融普惠到技术普惠

热门文章

  1. Docker容器的迁移
  2. Zabbix监控httpd服务
  3. mysql为什么用索引_MySql为什么使用B+树做索引
  4. Java 10.switch语句
  5. easyui js拼接html,class属性失效的问题
  6. Webx框架:Spring Schema 和 Spring Ext
  7. PHP开发经常遇到的几个错误
  8. TF-IDF(term frequency–inverse document frequency)
  9. iOS开发——UI基础-UIImage,UIImageView的使用
  10. JSON Undefined 问题