数据结构——遍历二叉树
数据结构——树、二叉树基础概念-CSDN博客https://blog.csdn.net/wy_05136/article/details/163543888?spm1001.2014.3001.5502一、二叉树遍历原理二叉树的遍历是指从根结点出发按照某种次序访问二叉树中所有结点使得每个结点被访问一次且仅被访问一次。二、二叉树结点定义/* 二叉链表有效结点 */ typedef int ElemType; typedef struct BTNode { ElemType data; //数据域 struct BTNode* leftchild; //左孩子指针域 struct BTNode* rightchild; //右孩子指针域 }BTNode;三、二叉树遍历方法一前序遍历根—左—右1.遍历规则若二叉树为空则空操作返回否则先访问根结点然后前序遍历左子树再前序遍历右子树。2.遍历算法及代码实现1递归版void preOrder(BTNode* root) { if (root NULL) return; //处理根结点 printf(%c , root-data); //递归处理左子树 preOrder(root-leftchild); //递归处理右子树 preOrder(root-rightchild); }2非递归版单栈法void preOrder_NoRecursion(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; //1.申请一个栈并将根节点入栈 std::stackBTNode* st; st.push(root); //2.进入while循环循环条件栈不为空 while (!st.empty()) { //3.取出栈顶结点并将其值打印处理 BTNode* tmp st.top(); printf(%c , tmp-data); st.pop(); //4.将刚处理的tmp结点的两个孩子按照先右再左的顺序进行判断处理如果存在则压入栈中 if (tmp-rightchild ! NULL) { st.push(tmp-rightchild); } if (tmp-leftchild ! NULL) { st.push(tmp-leftchild); } } //5.当while结束即栈空遍历结束 }二中序遍历左—根—右1.遍历规则若二叉树为空则空操作返回否则从根结点开始注意并不是先访问根结点中序遍历根结点的左子树然后是访问根结点最后中序遍历右子树。2.遍历算法及代码实现1递归版void inOrder(BTNode* root) { if (root NULL) return; //递归处理左子树 inOrder(root-leftchild); //处理根结点 printf(%c , root-data); //递归处理右子树 inOrder(root-rightchild); }2非递归版单栈法void inOrder_NoRecursion(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; //1.申请栈存储节点tag标记节点是否为第一次遇见 bool tag true; std::stackBTNode* st; st.push(root); //2.栈不为空持续循环遍历 while (!st.empty()) { //3.首次遇见节点且存在左子树持续向左入栈捋完所有左分支 while (tag st.top()-leftchild ! NULL) { st.push(st.top()-leftchild); } //4.左子树处理完毕访问当前根节点、出栈 BTNode* tmp st.top(); printf(%c , tmp-data); st.pop(); //5.判断并处理右子树更新标记位状态 if (tmp-rightchild ! NULL) { //有右孩子右节点入栈标记为首次访问 st.push(tmp-rightchild); tag true; } else { //无右孩子当前节点分支遍历完毕后续节点为回退二次访问 tag false; } } //6.栈空整棵树中序遍历结束 }三后续遍历左—右—根1.遍历规则若二叉树为空则空操作返回否则从左到右先叶子后结点的方式遍历访问左右子树最后是访问根结点。2.遍历算法及代码实现1递归版void postOrder(BTNode* root) { if (root NULL) return; //递归处理左子树 postOrder(root-leftchild); //递归处理右子树 postOrder(root-rightchild); //处理根结点 printf(%c , root-data); }2非递归版法一双栈法void postOrder_NoRecursion1(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; //1.申请两个栈S1用于遍历结点S2用于逆序存储后序结果 std::stackBTNode* S1; std::stackBTNode* S2; //2.根结点先入遍历栈S1 S1.push(root); //3.S1不为空持续遍历所有结点 while (!S1.empty()) { //4.S1栈顶结点出栈存入结果栈S2暂不打印 BTNode* tmp S1.top(); S2.push(tmp); S1.pop(); //5.先左、后右入S1保证后续S2出栈顺序为左—右—根 if (tmp-leftchild ! NULL) S1.push(tmp-leftchild); if (tmp-rightchild ! NULL) S1.push(tmp-rightchild); } //6.S1遍历完毕S2中结点逆序输出即为后序遍历结果 while (!S2.empty()) { printf(%c , S2.top()-data); S2.pop(); } }法二单栈法void postOrder_NoRecursion2(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; ///1.申请一个栈额外申请bool tag再额外申请BTNode *preNode std::stackBTNode* st; st.push(root); bool tag true; //标记是否首次访问节点 BTNode* preNode NULL; //记录上一个已访问的节点 //3.进入while循环循环条件是栈不空即可 while (!st.empty()) { //4.1 tag为true栈顶是新节点优先遍历左子树捋完所有左分支 while (tag true st.top()-leftchild ! NULL) { st.push(st.top()-leftchild); tag false; } //4.2 tag为false栈顶是回溯老节点左子树已处理完毕准备处理右子树 //5.判定右子树是否未被处理 //右孩子存在且不是上一个访问节点 说明右子树未遍历 if (st.top()-rightchild ! NULL st.top()-rightchild ! preNode) { st.push(st.top()-rightchild); tag true; } //5.2 右子树为空 / 右子树已处理完毕左右处理完成访问根节点 else { //6.处理根节点出栈打印更新标记位与前驱结点 BTNode* tmp st.top(); printf(%c , tmp-data); st.pop(); tag false; preNode tmp; } } //7.栈空后序遍历结束 }四层序遍历1.普通1遍历规则若树为空则空操作返回否则从树的第一层也就是根结点开始访问从上而下逐层遍历在同一层中按从左到右的顺序对结点逐个访问。2遍历算法及代码实现void Level_Traverse(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; //1.申请队列根结点入队 std::queueBTNode* q; q.push(root); //2.队列不为空持续循环遍历 while (!q.empty()) { //3.取出队头结点、访问数据、出队 BTNode* tmp q.front(); printf(%c , tmp-data); q.pop(); //先左后右子结点存在则入队保证层序从左到右 if (tmp-leftchild ! NULL) { q.push(tmp-leftchild); } if (tmp-rightchild ! NULL) { q.push(tmp-rightchild); } } //4.队列为空遍历完成 }2.正S1遍历规则若树为空则空操作返回否则从树的第一层也就是根结点开始访问从上而下逐层遍历在奇数层中按从左到右的顺序对结点逐个访问在偶数层中按从右到左的顺序对结点逐个访问。2遍历算法及代码实现void S_Level_Traverse(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; //1.根结点第一层/奇数层入栈S1 std::stackBTNode* s1, s2; s1.push(root); //2.两个栈任意一个非空持续遍历 while (!s1.empty() || !s2.empty()) { //3.处理奇数层S1非空、S2为空从左向右打印 while (!s1.empty()) { BTNode* tmp s1.top(); printf(%c , tmp-data); s1.pop(); //先右后左入栈保证下一层偶数层正序输出 if (tmp-rightchild ! NULL) { s2.push(tmp-rightchild); } if (tmp-leftchild ! NULL) { s2.push(tmp-leftchild); } } //4.处理偶数层S2非空、S1为空从右向左打印 while (!s2.empty()) { BTNode* tmp s2.top(); printf(%c , tmp-data); s2.pop(); //先左后右入栈保证下一层奇数层逆序输出 if (tmp-leftchild ! NULL) { s1.push(tmp-leftchild); } if (tmp-rightchild ! NULL) { s1.push(tmp-rightchild); } } } }3.倒S1遍历规则若树为空则空操作返回否则从树的第一层也就是根结点开始访问从上而下逐层遍历在奇数层中按从右到左的顺序对结点逐个访问在偶数层中按从左到右的顺序对结点逐个访问。2遍历算法及代码实现void S_Level_Traverse(BTNode* root) { //0.判空空树直接返回 if (root NULL) return; //1.根结点第一层/奇数层入栈S1 std::stackBTNode* s1, s2; s1.push(root); //2.两个栈任意一个非空持续遍历 while (!s1.empty() || !s2.empty()) { //3.处理奇数层S1非空、S2为空从右向左打印 while (!s1.empty()) { BTNode* tmp s1.top(); printf(%c , tmp-data); s1.pop(); //先左后右入栈保证下一层偶数层逆序输出 if (tmp-leftchild ! NULL) { s2.push(tmp-leftchild); } if (tmp-rightchild ! NULL) { s2.push(tmp-rightchild); } } //4.处理偶数层S2非空、S1为空从左向右打印 while (!s2.empty()) { BTNode* tmp s2.top(); printf(%c , tmp-data); s2.pop(); //先右后左入栈保证下一层奇数层正序输出 if (tmp-rightchild ! NULL) { s1.push(tmp-rightchild); } if (tmp-leftchild ! NULL) { s1.push(tmp-leftchild); } } } }

相关新闻

春招数据库岗笔试复盘:SQL、索引与国产数据库考点全解析

春招数据库岗笔试复盘:SQL、索引与国产数据库考点全解析

拿到这份卷子的时候,我刚好在带团队做数据库选型预研,手头堆着MySQL、PostgreSQL和达梦的对比材料。扫了一遍题目,说实话有点意外——这套春招数据库岗笔试比我预想的扎实,没有满屏的八股背诵,反而把索引原理、事务隔离…

2026/8/31 23:55:07 阅读更多 →
南昌高三全年冲刺班

南昌高三全年冲刺班

南昌高三全年冲刺班怎么选?南昌金博教育封闭管理分层教学助力冲刺 南昌金博教育是江西南昌一所专注于高三全年冲刺的全日制封闭管理学校,面向江西高三应届生、复读生招生,采用小班分层教学模式,食宿一体并配备生活老师全程跟进学生…

2026/8/31 21:33:18 阅读更多 →
漏洞扫描 安全加固实战:配置、检测与影响评估

漏洞扫描 安全加固实战:配置、检测与影响评估

漏洞扫描 安全加固实战:配置、检测与影响评估工具地址:https://www.speedce.com 社区论坛:https://bbs.speedce.com 联系:speedceadsgmail.com写在前面 围绕「漏洞扫描」,本文提供可落地的技术指南,并在关键…

2026/8/31 21:33:51 阅读更多 →

最新新闻

【项目编号:project84497】SpringBoot宠物信息管理系统:宠物档案、领养服务、用品展示、后台统计全流程实战

【项目编号:project84497】SpringBoot宠物信息管理系统:宠物档案、领养服务、用品展示、后台统计全流程实战

项目类型:宠物服务类项目项目编号:project84497核心关键词:SpringBoot、Java、MySQL、后台管理、前后台分离式页面、毕业设计、课程设计、源码、数据库脚本。项目背景:从真实场景出发宠物服务类平台通常包含宠物资料展示、领养信息…

2026/8/31 23:54:26 阅读更多 →
安装 Ollama——配置 Qwen2.5-VL-7B Q4_K_M

安装 Ollama——配置 Qwen2.5-VL-7B Q4_K_M

1. 安装 Ollama执行以下命令安装 Ollama:curl -fsSL https://ollama.com/install.sh | sh校验是否安装成功:ollama --version2. 配置环境变量(关键参数)export OLLAMA_HOST0.0.0.0:11434 export OLLAMA_MODELS/data/ollama/models…

2026/8/31 23:54:26 阅读更多 →
TRIO电源集成断路器:控制柜设计、选型与故障排查实战解析

TRIO电源集成断路器:控制柜设计、选型与故障排查实战解析

TRIO电源集成断路器这件事,我第一次听到的时候也觉得是个小改动,但真正用过之后才发现,这个组合对控制柜设计和现场维护的影响,比想象中大得多。电源在工业现场的角色就像控制柜的心脏,断路器则相当于心脏前面的保险阀…

2026/8/31 23:54:26 阅读更多 →
600V小型智能功率器件如何革新无刷直流电机驱动

600V小型智能功率器件如何革新无刷直流电机驱动

空调外机压缩机、工业风机、水泵、破壁机——这些设备里如今都少不了无刷直流电机,而驱动它们的核心部件,就是功率器件。我以前做电机驱动板的时候,最头疼的不是写FOC算法,反而是功率级那一摊子事:六个MOSFET、三个自举…

2026/8/31 23:54:26 阅读更多 →
真正让 Agent 能上线的,不是模型,而是 Harness

真正让 Agent 能上线的,不是模型,而是 Harness

很多 Agent Demo 看起来都很完整。 模型接收用户目标,分析上下文,选择 Tool,然后调用后台接口。只要模型选对了工具,整个链路就像已经成立。 比如用户说:帮我把这张订单退掉。Agent 查询订单,判断符合条件&…

2026/8/31 23:53:25 阅读更多 →
Sierra Forest 288核处理器:高密度服务器部署与调优指南

Sierra Forest 288核处理器:高密度服务器部署与调优指南

这两年服务器圈子里最让人兴奋的一个消息,就是 Intel 正式公开了代号 Sierra Forest 的新一代至强处理器,直接拉到 288 核心。你可能已经看过不少新闻稿,但我觉得更有意思的是它在“高密度服务器”这个场景里到底意味着什么,以及我…

2026/8/31 23:53:25 阅读更多 →

日新闻

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

2026/8/31 0:00:05 阅读更多 →
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

2026/8/31 0:00:05 阅读更多 →
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

2026/8/31 0:00:05 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/31 13:13:27 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/31 9:02:46 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/31 14:32:14 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →