Java 二叉树中序遍历(递归/非递归)
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 二叉树中序遍历(递归/非递归)相关推荐
- 详细图解二叉树中序遍历(非递归C++)LeetCode94
详细图解二叉树中序遍历(非递归) 二叉树中序递归含义 LeetCode题目94 详细图解 源代码 运行结果 二叉树中序递归含义 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.若二叉树为空则结 ...
- 二叉树中序遍历的非递归算法
根据二叉树的先序遍历结果创建一棵二叉树,即先创建根结点,然后再创建左子树,最后创建右子树,对于左右子树的创建也遵循根左右的原则,所以对于左右子树的创建可以递归调用本函数,此问题是典型的需要用递归算法求 ...
- JAVA 中序遍历的非递归栈实现
题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树. import java.util.*;/* ...
- c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)
五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...
- c语言 二叉树先序遍历(非递归)
/*************************** * author:vivi * date: 19-09-10 ****************************/ #include & ...
- 二叉树中序遍历(递归+非递归)Java
目录 一.结构 二.遍历二叉树 1.中序遍历(递归) 代码 图解 2.中序遍历(非递归) 代码 图解 一.结构 二.遍历二叉树 这块内容是二叉树最核心的部分.不但要掌握七种遍历的写法,前.中.后序的递 ...
- 二叉树——中序遍历(递归/非递归)
中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...
- 二叉树前序、中序和后序遍历的非递归实现
1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
最新文章
- 3.playbook基础
- Laravel项目上线部署
- 大型网站系统架构系列:负载均衡详解(一)
- JSON 转javabean 利器
- step5 . day2 网络编程 基于TPC协议的网络编程流程及API
- dotnet pack 打包文件版本号引起 Could not load file or assembly 问题
- LeetCode MySQL 1543. Fix Product Name Format(trim去空格+upper/lower大小写)
- 回放导出数据_王者荣耀本地视频怎么导出MP4格式视频文件?答案在这里
- python三种数据类型_Python零基础入门学习02:Python基本数据类型:数字类型
- Bootstrap CSS 编程规范之语法规范
- vue页面无操作10分钟内调转到登录页面
- Dos下面删除文件秘笈
- IGP-LAB-EIGRP-1
- CrossApp 1.1.6新鲜出炉
- ec6108v9a精简刷机包_华为悦盒无安装限制固件下载|华为悦盒EC6108V9A第三方精简流畅无安装限制固件 下载 - 巴士下载站...
- python海龟隐藏_Python海龟绘图——常用方法指令
- 爱荷华州立大学计算机学院,爱荷华州立大学最新qs世界排名
- 聚美优品广告词和经典分析
- 树链剖分 - 月下“毛景树”(BZOJ 4151)
- 硬盘安装linux镜像文件iso安装,通过ISO文件硬盘安装Ubuntu系统