二叉树——中序遍历(递归/非递归)
中序遍历,即遍历顺序为:左节点、根节点、右节点。
二叉树节点:
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个节点的完全二叉树:
运行结果:
过程示意图:
二叉树——中序遍历(递归/非递归)相关推荐
- 详细图解二叉树中序遍历(非递归C++)LeetCode94
详细图解二叉树中序遍历(非递归) 二叉树中序递归含义 LeetCode题目94 详细图解 源代码 运行结果 二叉树中序递归含义 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.若二叉树为空则结 ...
- 二叉树中序遍历的非递归算法
根据二叉树的先序遍历结果创建一棵二叉树,即先创建根结点,然后再创建左子树,最后创建右子树,对于左右子树的创建也遵循根左右的原则,所以对于左右子树的创建可以递归调用本函数,此问题是典型的需要用递归算法求 ...
- c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)
五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...
- JAVA 中序遍历的非递归栈实现
题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树. import java.util.*;/* ...
- c语言 二叉树先序遍历(非递归)
/*************************** * author:vivi * date: 19-09-10 ****************************/ #include & ...
- 二叉树前序、中序和后序遍历的非递归实现
1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
- 二叉树中序遍历(递归+非递归)Java
目录 一.结构 二.遍历二叉树 1.中序遍历(递归) 代码 图解 2.中序遍历(非递归) 代码 图解 一.结构 二.遍历二叉树 这块内容是二叉树最核心的部分.不但要掌握七种遍历的写法,前.中.后序的递 ...
- 【C语言】二叉树中序遍历(递归和非递归)算法
二叉树中序遍历的实现思想是: 访问当前节点的左子树: 访问根节点: 访问当前节点的右子树: 图 1 二叉树 以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1: ...
最新文章
- 如何使用Mockito模拟void方法
- java方法定义 与调用_Java方法的定义及调用
- 搭建kubernetes DashBoard
- 用ajax向后台传递数组参数
- IOS-多线程(NSOperation)
- 栈——用链表实现栈操作
- 各种光源(灯)的光谱
- oracle数据库重建em,oracle 11g em重建报唯一约束错误解决方法
- [React-Native]样式和布局
- 【限时早鸟票】数据技术十年相伴,DTC盛会北京重燃
- 云小课 | 云硬盘不用了如何处理?
- python之slice,range
- Ubuntu Linux 8.04 Vsftp 虚构用户设置
- html5 figure 标签
- 阿拉德之怒手游超详细图文架设教程
- U盘文件被隐藏后的修复方法
- C++ 罗马数字转整数
- 利用 perf4j 做服务监控
- 浅析人工智能体系建设
- VUE项目搭建的整个过程
热门文章
- java 下载网页,图片
- Python之Split函数
- 基于互质阵的DOA估计
- 【每日新闻】雷军:5G+AIoT是下一代的超级互联网
- Uncaught ReferenceError: xxx is not defined 解决办法
- os.rename和os.renames区别
- Messaging——Solace PubSub+
- Linux下修改conda环境下的pip安装目录
- android Imageview 显示本地绝对路径图片
- 系统信息:uname,sysinfo,gethostname,sysconf