发布时间:2026/8/25 7:44:54
树--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/8/25 7:39:54

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

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

2026/8/25 7:39:54

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

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

2026/8/25 7:39:54

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

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

2026/8/25 10:15:32

DanmakuFactory:三步把 XML 弹幕转成 ASS 字幕,特殊弹幕不丢

DanmakuFactory:三步把 XML 弹幕转成 ASS 字幕,特殊弹幕不丢 【免费下载链接】DanmakuFactory 支持特殊弹幕的xml转ass格式转换工具 项目地址: https://gitcode.com/gh_mirrors/da/DanmakuFactory 直播归档的人,手里多半都有一个从弹幕…

2026/8/25 10:15:32

AR+AI翻译、具身智能与极简交互:技术融合下的AI工程实践与机遇

1. 从“ARAI翻译”到“具身智能GPT”:一次技术融合的深度观察最近,几个看似独立的技术热点在圈子里被频繁提及:ARAI翻译系统、具身智能的“GPT时刻”,以及Claude带来的“极简革命”。乍一看,它们分属增强现实、人工智能…

2026/8/25 10:15:32

基于QClaw的动漫资源自动化追踪与推送系统实战指南

1. 项目缘起:从“追番焦虑”到自动化解决方案作为一个老二次元,我敢说每个追番人都有过类似的烦恼:每周要手动去各个平台、论坛、资源站翻找最新一集,生怕错过更新;遇到喜欢的冷门作品,更是要像侦探一样四处…

2026/8/25 10:15:32

Vue3+Element-Plus侧边菜单折叠:从状态管理到移动端适配的实战方案

1. 项目概述:从“能用”到“好用”的菜单交互进化在后台管理系统的开发中,左侧导航菜单的折叠与展开功能,看似是一个基础得不能再基础的交互。很多开发者,尤其是刚接触Vue3和Element-Plus的朋友,可能会觉得这不过就是控…

2026/8/25 10:15:32

Vue3+Element-Plus实现后台管理系统侧边菜单折叠与展开功能详解

1. 项目概述与核心价值最近在重构一个后台管理系统,菜单栏的折叠与展开功能是每个开发者都绕不开的“标配”。乍一看,这功能简单得像是“点击按钮,切换宽度”,但真做起来,你会发现从状态管理、动画过渡到布局自适应&am…

2026/8/25 10:10:31

FuAdmin表单设计器使用教程:可视化拖拽快速搭建复杂表单

FuAdmin表单设计器使用教程:可视化拖拽快速搭建复杂表单 【免费下载链接】fu-admin 采用当前最流行的技术栈 Vben Vue Vue3 Python Django Ninja(Fast Api 和 Django的结合)开发的后端管理系统 项目地址: https://gitcode.com/gh_mirrors/f…

2026/8/25 1:04:19

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 1:12:32

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 8:17:29

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 0:04:14

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

2026/8/25 0:04:14

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/24 18:13:48

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/25 1:08:14

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…