第二周 题目练习4(二叉树的遍历+二叉树深度+二叉树宽度+二叉树共同祖先LCA)洛谷P4913 B3642 P1305 P3884
P4913 【深基16.例3】二叉树深度 - 洛谷解题过程二叉树求深度模板 不同于课本上的直接递归//直接递归 ll depth(BiTree T) { if(TNULL) { return 0; } mdepth(T-lchild); ndepth(T-rchild); if(mn) { return (m1); } else { return (n1); } }//DFS递归 ll dfs(ll u) { if(u 0) return 0; ll ld dfs(l[u]); ll rd dfs(r[u]); return max(ld, rd) 1; }sizeq.size()可以保证内层循环for可以将这一层处理好 每层处理好之后 再depth可以保证不溢出//BFS层次遍历 queuellq; q.push(1); ll depth0; while(!q.empty()) { depth; ll sizeq.size(); for(ll i0;isize;i) { ll tq.front(); q.pop(); if(l[t]!0)q.push(l[t]); if(r[t]!0)q.push(r[t]); } }稍微改动一下就可以求widthll depth0; ll width0; while(!q.empty()) { depth; ll sizeq.size(); widthmax(width,size); //更新最大宽度 for(ll i0;isize;i) { ll tq.front(); q.pop(); if(l[t]!0)q.push(l[t]); if(r[t]!0)q.push(r[t]); } } coutdepth widthendl;实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; #define MAXSIZE 1000005 using namespace std; ll n; ll l[MAXSIZE]; ll r[MAXSIZE]; int main() { IOS cinn; for(ll i1;in;i) { cinl[i]r[i]; } queuellq; q.push(1); ll depth0; while(!q.empty()) { depth; ll sizeq.size(); for(ll i0;isize;i) { ll tq.front(); q.pop(); if(l[t]!0)q.push(l[t]); if(r[t]!0)q.push(r[t]); } } coutdepthendl; // coutfixedsetprecision(x) ; return 0; }B3642 二叉树的遍历 - 洛谷解题过程先序第一次碰到节点就输出弹出t– cout t然后压孩子不需要回头不需要标记。中序靠不断往左走的循环控制时机依靠指针t一路向左天然等到左子树走完再输出不用标记。后序弹出节点的时候你无法判断左右子树有没有遍历完毕不加标记分不清状态所以必须打上标签实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; #define MAXSIZE 1000005 using namespace std; ll n; ll l[MAXSIZE]; ll r[MAXSIZE]; void one() { stackllst; st.push(1); //先序 根左右 while(!st.empty()) { ll tst.top(); st.pop(); coutt ; if(r[t]!0)st.push(r[t]); if(l[t]!0)st.push(l[t]); } } //中序 左根右 void two() { stackllst; ll t1; while(t||!st.empty()) { while(t) { st.push(t); tl[t]; } tst.top(); st.pop(); coutt ; tr[t]; } } void three() { stackpairll,boolst; st.push({1,false}); while(!st.empty()) { pairll,boolcurst.top(); ll tcur.fi; bool viscur.se; st.pop(); if(!vis) { st.push({t,true}); if(r[t]) st.push({r[t],false}); if(l[t]) st.push({l[t],false}); } else { coutt ; } } } int main() { IOS cinn; for(ll i1;in;i) { cinl[i]r[i]; } one(); coutendl; two(); coutendl; three(); coutendl; // coutfixedsetprecision(x) ; return 0; }P1305 新二叉树 - 洛谷这个题跟上个题一样 唯一的不一样就是他的根是输入的 刚开始忘记这个了实现代码#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; #define MAXSIZE 256 using namespace std; ll n; char l[MAXSIZE]; char r[MAXSIZE]; char c[MAXSIZE]; char id,l1,r1; void one(char root) { stackcharst; st.push(root); //先序 根左右 while(!st.empty()) { char tst.top(); st.pop(); coutt; if(r[t]!*)st.push(r[t]); if(l[t]!*)st.push(l[t]); } } int main() { IOS cinn; char root; for(ll i0;in;i) { cinidl1r1; if(i0) { rootid; } l[id]l1; r[id]r1; } one(root); // coutfixedsetprecision(x) ; return 0; }[P3884JLOI2009] 二叉树问题 - 洛谷解题过程说明 LCA最近公共祖先深度最大求深度DFS(递归LCA) 无向树优点可以直接储存depthwidthfa[u];void dfs(int u,int father) { // 记录当前节点u的直接父亲 fa[u]father; // 当前节点层数 父节点层数 1 dep[u]dep[father]1; // 当前所在层的节点数量1用来后续求宽度 layer[dep[u]]; //持续更新全局最大层数遍历结束maxdepth就是树的深度答案 maxdepthmax(maxdepth,dep[u]); // 遍历和u相连的所有节点邻接表无向存储正反都存了边 for(int v:g[u]) { // 关键v是父节点就跳过避免往回走死循环 if(v ! father) { dfs(v,u);// v是u的子节点递归u变成v的父节点 } } }BFS(单独涉及二叉树深度使用)// BFS层序遍历替代DFS void bfs() { queuellq; q.push(1); fa[0][1] 0; //根节点1的父亲是0 dep[1] 1; layer[1]; maxdepth 1; while(!q.empty()) { ll u q.front(); q.pop(); for(ll v : g[u]) { if(v ! fa[0][u]) //不回走父节点 { fa[0][v] u; dep[v] dep[u] 1; layer[dep[v]]; maxdepth max(maxdepth, dep[v]); q.push(v); } } } }求宽度ll width0; for(ll i1;imaxdepth;i) { widthmax(width,layer[i]); }求距离 [共同祖先LCA] 设ans是共同祖先dx为x到ans的边数 dy是y到ans的边数距离dis2*dxdy//暴力LCA一步一步找 ll findLCA(ll x,ll y) { unordered_setlls; while(x!0)//收集 x 的全部祖先 { s.insert(x); xfa[x]; } while(!s.count(y))//y 向上找第一个重合祖先 { yfa[y]; } return y; }//倍增LCA 一次跳多步 //LOG 是我们自定义的常数代表倍增最大层数 //预处理倍增数组 void pre() { for(int k1;kLOG;k) { for(int u1;un;u) { fa[k][u] fa[k-1][ fa[k-1][u] ]; } } } ll LCA(ll x,ll y) { //保证x深度 y深度 if(dep[x] dep[y]) swap(x,y); //第一步x向上跳到和y同一深度 for(int kLOG-1;k0;k--) { if(dep[x] - (1k) dep[y]) { x fa[k][x]; } } if(x y) return x; //第二步同步向上跳 for(int kLOG-1;k0;k--) { if(fa[k][x] ! fa[k][y]) { xfa[k][x]; yfa[k][y]; } } return fa[0][x]; }代码实现//暴力LCA #includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; #define MAXSIZE 105 using namespace std; vectorllg[MAXSIZE];//邻接表存树的边 ll dep[MAXSIZE]; //dep[u]节点u所在层数深度 ll fa[MAXSIZE];//fa[u]节点u的直接父节点 ll layer[MAXSIZE]; //layer[k]第k层一共有多少个节点 ll maxdepth0; ll n; void dfs(ll u,ll father) { fa[u]father; dep[u]dep[father]1; layer[dep[u]]; maxdepthmax(maxdepth,dep[u]); for(ll v:g[u]) { if(v!father) { dfs(v,u); } } } ll findLCA(ll x,ll y) { unordered_setlls; while(x!0) { s.insert(x); xfa[x]; } while(!s.count(y)) { yfa[y]; } return y; } int main() { IOS cinn; for(ll i1;in;i) { ll u,v; cinuv; g[u].push_back(v); g[v].push_back(u); } ll x,y; cinxy; //求深度 dep[0]0; dfs(1,0); //求宽度 ll width0; for(ll i1;imaxdepth;i) { widthmax(width,layer[i]); } //计算祖先 ll afindLCA(x,y); ll dxdep[x]-dep[a]; ll dydep[y]-dep[a]; ll ans2*dxdy; coutmaxdepthendl; coutwidthendl; coutansendl; // coutfixedsetprecision(x) ; return 0; }//倍增LCA #includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define MAXSIZE 105 #define LOG 20 //最大2^19步足够 using namespace std; vectorllg[MAXSIZE]; ll dep[MAXSIZE]; ll fa[LOG][MAXSIZE]; //倍增表 fa[k][u] ll layer[MAXSIZE]; ll maxdepth0; ll n; //DFS 预处理dep 和 fa[0]父亲结点 void dfs(ll u,ll father) { fa[0][u]father; dep[u]dep[father]1; layer[dep[u]]; maxdepthmax(maxdepth,dep[u]); for(ll v:g[u]) { if(v!father) { dfs(v,u); } } } //预处理倍增数组 void pre() { for(int k1;kLOG;k) { for(int u1;un;u) { fa[k][u] fa[k-1][ fa[k-1][u] ]; } } } //倍增查询LCA ll LCA(ll x,ll y) { //保证x深度 y深度 if(dep[x] dep[y]) swap(x,y); //第一步x向上跳到和y同一深度 for(int kLOG-1;k0;k--) { if(dep[x] - (1k) dep[y]) { x fa[k][x]; } } if(x y) return x; //第二步同步向上跳 for(int kLOG-1;k0;k--) { if(fa[k][x] ! fa[k][y]) { xfa[k][x]; yfa[k][y]; } } return fa[0][x]; } int main() { IOS cinn; for(ll i1;in;i) { ll u,v; cinuv; g[u].push_back(v); g[v].push_back(u); } ll x,y; cinxy; dep[0]0; dfs(1,0); pre(); //构建倍增表 //求宽度 ll width0; for(ll i1;imaxdepth;i) { widthmax(width,layer[i]); } ll ancestor LCA(x,y); ll dxdep[x]-dep[ancestor]; ll dydep[y]-dep[ancestor]; ll ans2*dxdy; coutmaxdepthendl; coutwidthendl; coutansendl; return 0; }

相关新闻

出海企业商务考察研学班——参访·杭州

出海企业商务考察研学班——参访·杭州

钱塘文旅商学院 出海企业商务考察研学班 非遗参访杭州 杭州非遗企业一日行程参访(2380 元/人) 参访时间:单日 团组人数:20-30 人(小班化,保障体验与交流) 定位:东方美学空间、餐饮、…

2026/8/1 7:40:42阅读更多 →
TPC817光耦应用全解析:从核心参数到电路设计实战

TPC817光耦应用全解析:从核心参数到电路设计实战

1. 项目概述:为什么我们需要关注这颗“信号邮差”在工业控制、开关电源或者任何需要电气隔离的场合,你大概率会碰到一个不起眼却至关重要的黑色小方块——光耦。今天要聊的这颗TPC817,就是这类器件中一个非常经典和常见的型号。它不像MCU或者…

2026/8/1 7:40:42阅读更多 →
智慧隧道进化史

智慧隧道进化史

智慧隧道进化史:当山体中的通道长出“数字神经” 隧道,可能是人类工程中最特别的场景——它既是交通动脉上最脆弱的一环,也是技术密度最高的一个片段。 封闭空间、环境复杂、风险隐蔽、救援困难。这些特征让隧道运营长期停留在“靠人巡查、靠…

2026/8/1 7:40:42阅读更多 →
手机卡托又薄又小还高光,嘉腾闪测仪把多参数检测做到秒级批量完

手机卡托又薄又小还高光,嘉腾闪测仪把多参数检测做到秒级批量完

手机卡托生产车间里,一批批卡托从注塑机或CNC机台下来,等着检测。卡托外形尺寸偏了0.05mm,插不进手机中框;卡槽宽度超差,SIM卡装进去晃荡;顶针孔位置偏了,取卡针捅不进去。卡托尺寸虽小&#xf…

2026/8/1 9:01:04阅读更多 →
嵌入式开发必备:FatFS文件系统移植与实战应用详解

嵌入式开发必备:FatFS文件系统移植与实战应用详解

1. 从零开始:为什么嵌入式项目绕不开FatFS?如果你在玩ESP32、STM32这类微控制器,想把传感器数据存到SD卡里,或者从U盘里读取一个配置文件,那你大概率会碰到FatFS。这几乎是嵌入式圈子里处理FAT文件系统的“事实标准”&…

2026/8/1 9:01:04阅读更多 →
实战指南:如何高效配置HideMockLocation的完整流程

实战指南:如何高效配置HideMockLocation的完整流程

实战指南:如何高效配置HideMockLocation的完整流程 【免费下载链接】HideMockLocation Xposed module to hide the mock location setting. 项目地址: https://gitcode.com/gh_mirrors/hi/HideMockLocation HideMockLocation是一款专业的Xposed模块&#xff…

2026/8/1 9:01:04阅读更多 →
上海生产管理系统服务商:专业服务助力企业高效运营

上海生产管理系统服务商:专业服务助力企业高效运营

一、上海生产管理系统的现状与选择难题随着信息化时代的到来,越来越多的企业开始重视生产管理系统的应用。在上海,生产管理系统已经逐渐成为众多制造企业的标配,帮助企业实现从采购、仓储、生产到销售的全流程数字化管理。然而,面…

2026/8/1 9:01:04阅读更多 →
我发现了一个小而美的分享站,开发运维办公都能用

我发现了一个小而美的分享站,开发运维办公都能用

做开发、运维、办公经常遇到这些麻烦:转换图片还要下载软件、进制换算找不到工具、装 Linux 系统一堆报错、文本查重要开付费网站。今天分享一个小而美的分享站、本地处理不上传数据的工具站、资料查询站、资源下载站 —— 小胖叮的工具,打开即用&#x…

2026/8/1 9:01:04阅读更多 →
金蝶软件操作流程图文教程:从建账到总账完整指南

金蝶软件操作流程图文教程:从建账到总账完整指南

这次我们来看一个金蝶软件操作流程的详细教程资源。这个资源最大的特点是系统化整理了从零开始使用金蝶的全过程,特别适合财务新人、中小企业主或者需要自学金蝶的用户。 对于很多财务工作者来说,金蝶软件功能强大但操作复杂,网上教程往往零…

2026/8/1 8:59:04阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →