树--05---二叉树--02---二叉搜索树(BST)遍历

发布时间:2026/10/23 12:02:36

树--05---二叉树--02---二叉搜索树(BST)遍历 文章目录二叉树(BST)基础遍历----深度优先1. 前序遍历前序遍历的API实现步骤用的jDK自带的队列 LinkedBlockingDeque代码测试2.中序遍历中序遍历是按照Key从小到大遍历,最为重要中序遍历的API实现步骤代码测试:3. 后序遍历遍历的API实现步骤代码测试:二叉树的层序遍历----广度优先层序遍历的API实现步骤代码实现:测试:二叉树(BST)基础遍历----深度优先很多情况下我们可能需要像遍历数组数组一样遍历树从而拿出树中存储的每一个元素由于树状结构和线性结构不一样它没有办法从头开始依次向后遍历所以存在如何遍历也就是按照什么样的搜索路径进行遍历的问题。我们把树简单的画作上图中的样子由一个根节点、一个左子树、一个右子树组成那么按照根节点什么时候被访问我们可以把二叉树的遍历分为以下三种方式前序遍历先访问根结点然后再访问左子树最后访问右子树中序遍历先访问左子树中间访问根节点最后访问右子树后序遍历先访问左子树再访问右子树最后访问根节点如果我们分别对下面的树使用三种遍历方式进行遍历得到的结果如下1. 前序遍历前序遍历的API实现步骤把当前结点的key放入到队列中;找到当前结点的左子树如果不为空递归遍历左子树找到当前结点的右子树如果不为空递归遍历右子树用的jDK自带的队列 LinkedBlockingDeque代码//获取整个树中所有的键publicQueueKeypreErgodic(){QueueKeykeysnewLinkedBlockingDeque();preErgodic(root,keys);returnkeys;}//获取指定树x的所有键并放到keys队列中privatevoidpreErgodic(Nodex,QueueKeykeys){if(xnull){return;}//把x结点的key放入到keys中keys.add(x.key);//递归遍历x结点的左子树if(x.left!null){preErgodic(x.left,keys);}//递归遍历x结点的右子树if(x.right!null){preErgodic(x.right,keys);}}测试Testpublicvoidtest01(){//创建树对象BinaryTreeString,StringtreenewBinaryTree();//往树中添加数据tree.put(E,5);tree.put(B,2);tree.put(G,7);tree.put(A,1);tree.put(D,4);tree.put(F,6);tree.put(H,8);tree.put(C,3);//遍历QueueStringkeystree.preErgodic();for(Stringkey:keys){Stringvaluetree.get(key);System.out.println(key----value);}}2.中序遍历中序遍历是按照Key从小到大遍历,最为重要中序遍历的API实现步骤找到当前结点的左子树如果不为空递归遍历左子树把当前结点的key放入到队列中;找到当前结点的右子树如果不为空递归遍历右子树代码//使用中序遍历获取树中所有的键publicQueueKeymidErgodic(){QueueKeykeysnewLinkedBlockingDeque();midErgodic(root,keys);returnkeys;}//使用中序遍历获取指定树x中所有的键并存放到key中privatevoidmidErgodic(Nodex,QueueKeykeys){if(xnull){return;}//先递归把左子树中的键放到keys中if(x.left!null){midErgodic(x.left,keys);}//把当前结点x的键放到keys中keys.add(x.key);//在递归把右子树中的键放到keys中if(x.right!null){midErgodic(x.right,keys);}}测试:Testpublicvoidtest02(){//创建树对象BinaryTreeString,StringtreenewBinaryTree();//往树中添加数据tree.put(E,5);tree.put(B,2);tree.put(G,7);tree.put(A,1);tree.put(D,4);tree.put(F,6);tree.put(H,8);tree.put(C,3);//遍历QueueStringkeystree.midErgodic();for(Stringkey:keys){Stringvaluetree.get(key);System.out.println(key----value);}}3. 后序遍历遍历的API实现步骤找到当前结点的左子树如果不为空递归遍历左子树找到当前结点的右子树如果不为空递归遍历右子树把当前结点的key放入到队列中;代码//使用后序遍历把整个树中所有的键返回publicQueueKeyafterErgodic(){QueueKeykeysnewLinkedBlockingDeque();afterErgodic(root,keys);returnkeys;}//使用后序遍历把指定树x中所有的键放入到keys中privatevoidafterErgodic(Nodex,QueueKeykeys){if(xnull){return;}//通过递归把左子树中所有的键放入到keys中if(x.left!null){afterErgodic(x.left,keys);}//通过递归把右子树中所有的键放入到keys中if(x.right!null){afterErgodic(x.right,keys);}//把x结点的键放入到keys中keys.add(x.key);}测试:Testpublicvoidtest03(){//创建树对象BinaryTreeString,StringtreenewBinaryTree();//往树中添加数据tree.put(E,5);tree.put(B,2);tree.put(G,7);tree.put(A,1);tree.put(D,4);tree.put(F,6);tree.put(H,8);tree.put(C,3);//遍历QueueStringkeystree.afterErgodic();for(Stringkey:keys){Stringvaluetree.get(key);System.out.println(key----value);}}二叉树的层序遍历----广度优先所谓的层序遍历就是从根节点第一层开始依次向下获取每一层所有结点的值有二叉树如下那么层序遍历的结果是EBGADFHC层序遍历的API实现步骤创建队列存储每一层的结点使用循环从队列中弹出一个结点获取当前结点的key如果当前结点的左子结点不为空则把左子结点放入到队列中如果当前结点的右子结点不为空则把右子结点放入到队列中代码实现://使用层序遍历获取整个树中所有的键publicQueueKeylayerErgodic(){//定义两个队列分别存储树中的键和树中的结点QueueKeykeysnewLinkedBlockingDeque();QueueNodenodesnewLinkedBlockingDeque();//默认往队列中放入根结点nodes.add(root);while(!nodes.isEmpty()){//从队列中弹出一个结点把key放入到keys中Nodennodes.poll();keys.add(n.key);//判断当前结点还有没有左子结点如果有则放入到nodes中if(n.left!null){nodes.add(n.left);}//判断当前结点还有没有右子结点如果有则放入到nodes中if(n.right!null){nodes.add(n.right);}}returnkeys;}测试:Testpublicvoidtest01(){//创建树对象BinaryTreeString,StringtreenewBinaryTree();//往树中添加数据tree.put(E,5);tree.put(B,2);tree.put(G,7);tree.put(A,1);tree.put(D,4);tree.put(F,6);tree.put(H,8);tree.put(C,3);//遍历QueueStringkeystree.layerErgodic();for(Stringkey:keys){Stringvaluetree.get(key);System.out.println(key----value);}}
延伸阅读

更多相关文章

2026/10/21 11:33:43

Pandas高效读取CSV指定列:usecols参数详解与内存优化实战

1. 项目概述:为什么“读取CSV某几列”是个高频刚需?刚接触数据处理的朋友,拿到一个CSV文件,第一反应可能就是pandas.read_csv一把梭,把整个文件读进内存。这当然没错,但当你面对一个动辄几百列、几十万行的…

2026/10/22 14:08:25

从CRUD到业务闭环:SpringBoot管理系统实战设计思维

最近在整理一些社区服务项目时,发现一个挺有意思的现象:很多开发者,尤其是学生和初级开发者,在接到“做一个XX管理系统”这类任务时,第一反应往往是去网上找一套“SpringBoot Vue”的模板,然后开始对着数据…

2026/10/22 13:49:41

Python高效读取CSV特定列:Pandas与csv模块实战指南

1. 项目概述:为什么读取CSV的特定列是数据处理的基石如果你刚开始用Python处理数据,第一个拦路虎往往不是复杂的算法,而是怎么把数据文件“喂”给程序。CSV(Comma-Separated Values)文件,这种用逗号分隔的纯…

2026/10/23 17:55:37

VB .NET OPC入门实战:从零跑通第一个工业自动化连接示例

简介:这份资源是一套面向工业自动化方向开发者的 VB .NET 与 OPC 通信入门示例,适合刚接触 OPC 技术、需要在 VB .NET 项目中对接 OPC 服务器的初学者与工程师参考。压缩包共 38 个文件,约 194KB,包含 4 个 vb 源代码文件、2 个 v…

2026/10/23 17:55:37

Java学生成绩管理系统:从需求到验收的完整设计与实现

简介:这是一套面向高校计算机相关专业学生与Java初学者的课程设计/期末作业参考资源,围绕学生成绩管理系统展开,采用Java语言结合GUI界面与数据库实现,适合需要完成课程设计、巩固JDBC与界面编程技能的学习者。压缩包共80个文件&a…

2026/10/23 17:55:37

联想E430刷BIOS 2.5:避坑、救砖与冷启动验证

简介:联想ThinkPad E430 BIOS 2.52 更新包面向仍在使用该型号笔记本、需要提升硬件兼容性与系统稳定性的用户,核心内容为Windows环境下执行的BIOS升级程序及配套说明文档。压缩包共2个文件,包含1个exe升级程序与1个htm说明页,整体…

2026/10/23 17:55:37

Codex 的 Skill 什么时候该触发?把任务条件写进仓库,少一次误操作

Codex 的 Skill 什么时候该触发?把任务条件写进仓库,少一次误操作 Skill 不是“功能更多”的同义词,它适合把有固定前置条件的工作流封装起来。部署、改生产数据和处理受控文档,都应先判断是否命中明确条件;纯文案修正、只读检查则不应因为看到了同一个工具名就进入高影响…

2026/10/23 17:55:37

Codex 接手旧仓库先别“全量扫描”:三段范围让首轮结论可复核

Codex 接手旧仓库先别“全量扫描”:三段范围让首轮结论可复核 接手一个有告警的旧仓库时,最危险的开场白往往是“把所有问题都找出来”。它把目标、读权限和交付格式混在一起,既难复核,也容易让代理过早改文件。更可靠的做法是把首轮任务拆成范围、证据、禁止动作三段:只…

2026/10/23 17:50:37

RHCSA/RHCE备考沙盒:RHEL 8.0虚拟化环境与自动评分系统详解

简介:面向RHCSA与RHCE备考学员的RH134、RH294实验环境说明文档,系统梳理Red Hat Enterprise Linux 8.0模拟培训平台的硬件配置、主机角色、账号密码及常用管理命令。文档对RH134环境中的foundation、workstation、servera/b及bastion网关功能逐一说明&am…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑