Java 二叉树中序遍历(递归/非递归)

  • 中序遍历
  • 代码实现
    • 递归方式
    • 非递归方式

简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。

设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有几种情况:DLR(称为先序遍历),LDR(称为中序遍历),LRD (称为后序遍历),层次遍历。

中序遍历

中序遍历:首先遍历左子树,然后访问根结点,最后遍历右子树。

如图所示二叉树的中序遍历结果为:[9,8,3,4,15,20,7]

代码实现

递归方式

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();inorder(root, res);return res;
}public void inorder(TreeNode root, List<Integer> res) {if (root == null) {return;}inorder(root.left, res);res.add(root.val);inorder(root.right, res);
}

非递归方式

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();Deque<TreeNode> stk = new LinkedList<TreeNode>();while (root != null || !stk.isEmpty()) {while (root != null) {stk.push(root);root = root.left;}root = stk.pop();res.add(root.val);root = root.right;}return res;
}

完整代码:

public static void main(String[] args) {TreeNode root = new TreeNode(3);TreeNode n1 = new TreeNode(9);TreeNode n2 = new TreeNode(20);TreeNode n3 = new TreeNode(8);TreeNode n4 = new TreeNode(15);TreeNode n5 = new TreeNode(7);TreeNode n6 = new TreeNode(4);root.left = n1;root.right = n2;n1.right = n3;n2.left = n4;n2.right = n5;n4.left = n6;List<Integer> rs = inorderTraversal(root);System.out.println("递归中序遍历结果:" + rs);rs = preorderTraversal2(root);System.out.println("非递归中序遍历结果:" + rs);
}// 递归
public static List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();inorder(root, res);return res;
}public static void inorder(TreeNode root, List<Integer> res) {if (root == null) {return;}inorder(root.left, res);res.add(root.val);inorder(root.right, res);
}// 非递归
public static List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();Deque<TreeNode> stk = new LinkedList<TreeNode>();while (root != null || !stk.isEmpty()) {while (root != null) {stk.push(root);root = root.left;}root = stk.pop();res.add(root.val);root = root.right;}return res;
}

运行结果:

Java 二叉树中序遍历(递归/非递归)相关推荐

  1. 详细图解二叉树中序遍历(非递归C++)LeetCode94

    详细图解二叉树中序遍历(非递归) 二叉树中序递归含义 LeetCode题目94 详细图解 源代码 运行结果 二叉树中序递归含义 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.若二叉树为空则结 ...

  2. 二叉树中序遍历的非递归算法

    根据二叉树的先序遍历结果创建一棵二叉树,即先创建根结点,然后再创建左子树,最后创建右子树,对于左右子树的创建也遵循根左右的原则,所以对于左右子树的创建可以递归调用本函数,此问题是典型的需要用递归算法求 ...

  3. JAVA 中序遍历的非递归栈实现

    题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树. import java.util.*;/* ...

  4. c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)

    五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...

  5. c语言 二叉树先序遍历(非递归)

    /*************************** * author:vivi * date: 19-09-10 ****************************/ #include & ...

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

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

  7. 二叉树——中序遍历(递归/非递归)

    中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...

  8. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  9. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

最新文章

  1. 3.playbook基础
  2. Laravel项目上线部署
  3. 大型网站系统架构系列:负载均衡详解(一)
  4. JSON 转javabean 利器
  5. step5 . day2 网络编程 基于TPC协议的网络编程流程及API
  6. dotnet pack 打包文件版本号引起 Could not load file or assembly 问题
  7. LeetCode MySQL 1543. Fix Product Name Format(trim去空格+upper/lower大小写)
  8. 回放导出数据_王者荣耀本地视频怎么导出MP4格式视频文件?答案在这里
  9. python三种数据类型_Python零基础入门学习02:Python基本数据类型:数字类型
  10. Bootstrap CSS 编程规范之语法规范
  11. vue页面无操作10分钟内调转到登录页面
  12. Dos下面删除文件秘笈
  13. IGP-LAB-EIGRP-1
  14. CrossApp 1.1.6新鲜出炉
  15. ec6108v9a精简刷机包_华为悦盒无安装限制固件下载|华为悦盒EC6108V9A第三方精简流畅无安装限制固件 下载 - 巴士下载站...
  16. python海龟隐藏_Python海龟绘图——常用方法指令
  17. 爱荷华州立大学计算机学院,爱荷华州立大学最新qs世界排名
  18. 聚美优品广告词和经典分析
  19. 树链剖分 - 月下“毛景树”(BZOJ 4151)
  20. 硬盘安装linux镜像文件iso安装,通过ISO文件硬盘安装Ubuntu系统

热门文章

  1. 年底了还没入门?分享下我的自动驾驶与CV算法工程师成长路线图(双十二巨献)...
  2. BST树遍历O(n)时间复杂度+O(1)空间复杂度
  3. C语言——赋值运算符、复合的赋值运算符、自增自减运算符、逗号运算符、条件运算符、goto语句、注释
  4. 爬虫出现403错误解决办法
  5. axios如何发送请求
  6. java 字符串全半角转换工具
  7. ChatGPT常用提问技巧
  8. 高等数学18讲(19版)7.30
  9. Java设计模式之回调函数
  10. ASK幅移键控发生器(正弦波,矩形波信号产生)