中序遍历,即遍历顺序为:左节点、根节点、右节点。

二叉树节点:

public class Node {public Node left;public Node right;public int val;public Node(int data){this.val = data;}
}

1. 递归方式

思想同二叉树——先序遍历(递归/非递归)

2. 非递归方式

借助数据栈。步骤:
当根节点非空时,申请一个数据栈;
在【栈非空 或 head非空】时,重复执行下述操作:
1). 如果head非空,把它压入栈中,并让head指向它的左孩子。
2). 如果head为空,弹出栈顶节点,用head保存该节点,并打印该节点的值,并让head指向它的右孩子。

在压栈操作后,head指向左孩子,在出栈操作后,head指向右孩子,所以head已经不代表根节点,而是作为一个临时指针节点,
从而把左孩子依次压入栈,直到左孩子为空,然后出栈,在出栈的时候用head保存弹出的节点,打印其数值,并指向该节点的右孩子,如果其右孩子不为空,则符合while循环条件,重复执行压栈操作~


代码:

import java.util.Stack;/*中序遍历:递归方式和非递归方式,打印二叉树节点的值* 参数:根节点* 输出:void*/
public class InOrder {//中序遍历,递归方式public static void inOrderRecursion(Node head){if(head == null){System.out.println("二叉树为空");return;}if(head.left != null){inOrderRecursion(head.left);}System.out.print(head.val+", ");if(head.right != null){inOrderRecursion(head.right);}}-------------------------------------//中序遍历,非递归方式public static void inOrder(Node head){if(head == null){System.out.println("二叉树为空");return;}System.out.println("中序遍历,非递归方式");Stack<Node> s = new Stack<Node>();while( !s.isEmpty() || head !=null ){if(head !=null){s.push(head);head = head.left;}else{head = s.pop();System.out.print(head.val+", ");head = head.right;}}}------------------测试-------------------public static void main(String[] args) {//创建二叉树节点Node head = new Node(1);Node n1 = new Node(2);Node n2 = new Node(3);Node n3 = new Node(4);Node n4 = new Node(5);Node n5 = new Node(6);Node n6 = new Node(7);//生成二叉树head.left = n1;head.right = n2;n1.left = n3;n1.right = n4;n2.left = n5;n2.right = n6;//递归方式中序遍历二叉树inOrderRecursion(head);System.out.println();System.out.println();//递归方式中序遍历二叉树inOrder(head);}
}

本例创建了一个包含有7个节点的完全二叉树:

运行结果:

过程示意图:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【C语言】二叉树中序遍历(递归和非递归)算法

    二叉树中序遍历的实现思想是: 访问当前节点的左子树: 访问根节点: 访问当前节点的右子树: 图 1 二叉树 以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1: ...

最新文章

  1. 如何使用Mockito模拟void方法
  2. java方法定义 与调用_Java方法的定义及调用
  3. 搭建kubernetes DashBoard
  4. 用ajax向后台传递数组参数
  5. IOS-多线程(NSOperation)
  6. 栈——用链表实现栈操作
  7. 各种光源(灯)的光谱
  8. oracle数据库重建em,oracle 11g em重建报唯一约束错误解决方法
  9. [React-Native]样式和布局
  10. 【限时早鸟票】数据技术十年相伴,DTC盛会北京重燃
  11. 云小课 | 云硬盘不用了如何处理?
  12. python之slice,range
  13. Ubuntu Linux 8.04 Vsftp 虚构用户设置
  14. html5 figure 标签
  15. 阿拉德之怒手游超详细图文架设教程
  16. U盘文件被隐藏后的修复方法
  17. C++ 罗马数字转整数
  18. 利用 perf4j 做服务监控
  19. 浅析人工智能体系建设
  20. VUE项目搭建的整个过程

热门文章

  1. java 下载网页,图片
  2. Python之Split函数
  3. 基于互质阵的DOA估计
  4. 【每日新闻】雷军:5G+AIoT是下一代的超级互联网
  5. Uncaught ReferenceError: xxx is not defined 解决办法
  6. os.rename和os.renames区别
  7. Messaging——Solace PubSub+
  8. Linux下修改conda环境下的pip安装目录
  9. android Imageview 显示本地绝对路径图片
  10. 系统信息:uname,sysinfo,gethostname,sysconf