深入理解二叉树遍历:前序、中序、后序和层级遍历的Java实现

前言

二叉树的遍历方式是对树中节点进行访问的方法,常见的包括前序、中序、后序和层级遍历。本文将深入探讨这些遍历方式的实现原理,并使用Java代码和图示进行详细讲解。

二叉树遍历介绍

在二叉树中,遍历指的是按照一定顺序访问树中的所有节点。常见的遍历方式包括前序、中序、后序和层级遍历。下面我们将分别介绍这些遍历方式的实现和图示。

1. 前序遍历(Preorder Traversal)

前序遍历的顺序是先访问根节点,然后递归地前序遍历左子树,最后前序遍历右子树。在前序遍历中,节点的访问顺序为 根-左-右。

class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val = val;this.left = null;this.right = null;}
}public void preorderTraversal(TreeNode root) {if (root != null) {System.out.print(root.val + " "); // 访问根节点preorderTraversal(root.left); // 前序遍历左子树preorderTraversal(root.right); // 前序遍历右子树}
}
示例二叉树:
      A/ \B   C/ \ / \D  E F  G

前序遍历结果:A -> B -> D -> E -> C -> F -> G

2. 中序遍历(Inorder Traversal)

中序遍历的顺序是先递归地中序遍历左子树,然后访问根节点,最后中序遍历右子树。在中序遍历中,节点的访问顺序为 左-根-右。

public void inorderTraversal(TreeNode root) {if (root != null) {inorderTraversal(root.left); // 中序遍历左子树System.out.print(root.val + " "); // 访问根节点inorderTraversal(root.right); // 中序遍历右子树}
}
示例二叉树:
      A/ \B   C/ \ / \D  E F  G

中序遍历结果:D -> B -> E -> A -> F -> C -> G

3. 后序遍历(Postorder Traversal)

后序遍历的顺序是先递归地后序遍历左子树和右子树,然后访问根节点。在后序遍历中,节点的访问顺序为 左-右-根。

public void postorderTraversal(TreeNode root) {if (root != null) {postorderTraversal(root.left); // 后序遍历左子树postorderTraversal(root.right); // 后序遍历右子树System.out.print(root.val + " "); // 访问根节点}
}
示例二叉树:
      A/ \B   C/ \ / \D  E F  G

后序遍历结果:D -> E -> B -> F -> G -> C -> A

4. 层级遍历(Level Order Traversal)

层级遍历是按照树的层级顺序逐层访问节点,从上到下、从左到右。我们使用队列来实现层级遍历,确保每一层的节点按顺序被访问。

import java.util.Queue;
import java.util.LinkedList;public void levelOrderTraversal(TreeNode root) {if (root == null) return;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();System.out.print(node.val + " "); // 访问当前节点if (node.left != null) {queue.offer(node.left); // 将左子节点加入队列}if (node.right != null) {queue.offer(node.right); // 将右子节点加入队列}}
}
示例二叉树:
      A/ \B   C/ \ / \D  E F  G

层级遍历结果:A -> B -> C -> D -> E -> F -> G

结语

通过本文,我们详细介绍了二叉树的四种遍历方式:前序遍历、中序遍历、后序遍历和层级遍历,并给出了Java实现代码和示例图示。这些遍历方式在算法和数据结构中非常重要,对于理解树形结构和解决相关问题有着重要的作用。喜欢本文的话,请点赞收藏并关注我的博客,获取更多精彩内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctr/cvr预估之WideDeep模型

ctr/cvr预估之Wide&Deep模型 在探索点击率&#xff08;CTR&#xff09;和转化率&#xff08;CVR&#xff09;预估的领域中&#xff0c;我们始终追求的是一种既能捕获数据中的线性关系&#xff0c;又能发现复杂模式的模型。因子分解机&#xff08;Factorization Machines, …

华为大咖说 | 从《庖丁解牛》谈项目经理的三重境界

本文作者&#xff1a; 李庆&#xff08;华为项目管理能力中心高级项目管理专家&#xff09; 全文约1945字&#xff0c;阅读约需6分钟&#xff0c;请仔细看看哦~ 近日我重读庄子的《庖丁解牛》&#xff0c;感悟良多&#xff0c;有了更深的理解。以前读到此故事时&#xff0c;只…

微服务SpringCloud,SpringAliBaBa(2)

微服务02 1.网关路由 网络的关口&#xff0c;负责请求的路由、转发、身份校验。 有了网关之后&#xff0c;微服务的地址不用在暴露了&#xff0c;就暴露个网关地址。 快速入门 routes代表一套路由&#xff0c;pridicates是规则&#xff0c;对请求做出判断&#xff0c;看是哪…

[C++深入] --- malloc/free和new/delete

1 new运算符的拓展 1.1 自由存储区与堆的概念 在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。 new操作符从自由存储区(free st…

[大师C语言(第三十六篇)]C语言信号处理:深入解析与实战

引言 在计算机科学中&#xff0c;信号是一种软件中断&#xff0c;它允许进程之间或进程与内核之间进行通信。信号处理是操作系统中的一个重要概念&#xff0c;它允许程序对各种事件做出响应&#xff0c;例如用户中断、硬件异常和系统调用。C语言作为一门接近硬件的编程语言&am…

今日头条豆包大语言模型api接入python SDK,安装官方库报错,解决方法

豆包python大语言模型库安装指令&#xff1a; pip install volcengine-python-sdk 报错&#xff1a; note: This error originates from a subprocess, and is likely not a problem with pip.ERROR: Failed building wheel for volcengine-python-sdkRunning setup.py clea…

java8 将对象list中的某一个属性取出组成一个list

实体类 public class Sp {String spdm;String spmc;public Sp() {}public Sp(String spdm, String spmc) {this.spdm spdm;this.spmc spmc;}public String getSpdm() {return spdm;}public void setSpdm(String spdm) {this.spdm spdm;}public String getSpmc() {return sp…

数据库讲解---(数据库设计)

目录 一.数据库设计概述 1.1数据库设计的内容 1.1.1数据库的结构设计 1.1.2数据库的行为设计 1.2数据库设计方法 1.2.1直观设计法 1.2.2规范设计法 1.2.3计算机辅助设计法 1.2.4自动化设计法 1.3数据库设计的基本步骤 1.3.1需求分析 1.3.2概念结构设计 1.3.3逻辑结…

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍&#xff1a; 一、气象站的种类 根据用途和安装环境分类&#xff1a; 农业气象站&#xff1a;专为农业生产服务&#xff0c;监测土壤温度、湿度等参数&am…

替代LTC3855双通道多相带差分遥测DC-DC同步控制器

特性:双通道、180 定相控制器降低了所需的输入电容和电源感应噪声高效率&#xff1a;达 95%RSENSE 或 DCR 电流检测可编程 DCR 温度补偿0.75%、0.6V 输出电压准确度可锁相固定频率&#xff1a;250kHz 至 770kHz真正的远端采样差分放大器双路 N 沟道 MOSFET 同步驱动宽 VIN 范围…

huggingface accelerate 多机多卡DDP分布式训练案例

参考: https://www.bilibili.com/video/BV1jS411K72E/?spm_id_from=333.788&vd_source=34d74181abefaf9d8141bbf0d485cde7 https://github.com/chunhuizhang/pytorch_distribute_tutorials/blob/main/tutorials/deepspeed_accelerate/accelerate_basics_scripts.py htt…

x264 码率控制 AQmode 算法原理:i_inv_qscale_factor 变量

介绍 关于 AQmode 整体算法的介绍可以参考:x264 码率控制中自适应量化模式 AQ mode分析 。i_inv_qscale_factor是一个uint16_t类型的指针变量,在 frame.h 头文件x264_frame_t结构体中声明,主要用来针对每个宏块 MB 进行相关值存储。在 frame.c 文件中*frame_new函数中在 fen…

oracle 12c/19c OEM 无法访问怎么办?

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。到了12…

网页中一些基本元素

1、页尾自适应 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&g…

智慧校园-科研管理系统总体概述

在当前教育与科研深度融合的大潮中&#xff0c;智慧校园科研管理系统脱颖而出&#xff0c;它巧妙地融合了现代科技的力量&#xff0c;诸如云计算、大数据分析及人工智能技术&#xff0c;旨在为高等学府与科研机构打造一个高效运转、透明公开、促进协作的科研管理新生态。这一系…

探索密码校验技术:Spring Security中的多种加密方式

探索密码校验技术&#xff1a;Spring Security中的多种加密方式 在Web应用中&#xff0c;密码的安全存储和验证是至关重要的。本文将通过一个具体的代码示例&#xff0c;介绍和总结如何在Spring Security中使用多种加密方式进行密码校验。我们将重点讲解BCrypt和MD5两种加密方…

JVM-GC-CMS垃圾回收器

JVM-CMS垃圾回收器 CMS垃圾回收的步骤 1. 初始标记&#xff08;InitialMarking&#xff09; 这是一个STW的过程&#xff0c;并行标记&#xff0c;只是标记GC Roots能直接关联到的对象。由于GC Root直接关联的对象少&#xff0c;因此STW时间比较短。 2. 并发标记 非STW的过程&…

0-30 VDC 稳压电源,电流控制 0.002-3 A

怎么运行的 首先&#xff0c;有一个次级绕组额定值为 24 V/3 A 的降压电源变压器&#xff0c;连接在电路输入点的引脚 1 和 2 上。&#xff08;电源输出的质量将直接影响与变压器的质量成正比&#xff09;。变压器次级绕组的交流电压经四个二极管D1-D4组成的电桥整流。桥输出端…

ETO MARKETS:美股涨势告急?通胀风暴或成市场新拐点

摘要&#xff1a; 近期美股涨势引发了市场对其可持续性的质疑。随着通胀数据的发布&#xff0c;全球利率前景可能面临新的变化。投资者需关注即将到来的通胀数据及其对市场的影响。本周的市场波动加剧&#xff0c;政治风险和经济数据共同作用&#xff0c;将为未来的市场走向提…

React 扩展

文章目录 PureComponent1. 使用 React.Component&#xff0c;不会进行浅比较2. 使用 shouldComponentUpdate 生命周期钩子&#xff0c;手动比较3. 使用 React.PureComponent&#xff0c;自动进行浅比较 Render Props1. 使用 Children props&#xff08;通过组件标签体传入结构&…