news 2026/3/6 1:23:51

新二叉树(洛谷P1305)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
新二叉树(洛谷P1305)

题目描述

输入一串二叉树,输出其前序遍历。

输入格式

第一行为二叉树的节点数 n。(1≤n≤26)

后面 n 行,第一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。

空节点用*表示

输出格式

二叉树的前序遍历。

输入输出样例

输入 #1复制运行

6 abc bdi cj* d** i** j**

输出 #1复制运行

abdicj

核心逻辑:

在处理二叉树时,初学者习惯用k*2/k*2+1存储左右儿子。但这种顺序存储遇到世代单传子树(只有单边子树的深树)会使下标呈指数级爆炸。

本方案采用静态链表思路:用结构体数组存节点,配合一个计数器cnt分配空间。无论树长成什么样,空间复杂度始终稳定在O(N)。


实现步骤

  1. 定义结构:每个node记录lr数组下标,而不是物理地址。

  2. 动态赋值

    • 第一行输入确定根节点tre[1]

    • 后续输入格式为父节点 左孩子 右孩子

  3. 暴力查找(核心):

    每次读入一行,就去数组里扫一遍,找到那个 data 匹配的节点,然后把它的 l 和 r 指向新分配的 cnt 位置。

  4. 递归输出:标准的先序遍历(根->左->右)。


关键点

  • 关于*的处理:输入如果是*代表空,就不给它分配cnt下标,直接跳过即可。

  • 查找效率:目前代码找父节点用的是O(N)$遍历,对于N=2000的题足够了,但如果节点上万,建议换成unordered_map来秒查位置。

  • 空间预留tre[2000]的大小要根据题目N的范围来定,不开太小,也不开太大。


总结

“数组模拟链表”的做法是竞赛里的“万金油”,既能省去new内存的耗时,又能防止顺序存储的内存溢出。

完整代码

//用链式存储 顺序存储如果是世代单纯 效率太低 #include <iostream> using namespace std; string a; struct node{ int l; int r; char data; }tre[2000]; void preorder(int root){ cout<<tre[root].data; if(tre[root].l) preorder(tre[root].l); if(tre[root].r) preorder(tre[root].r); } int main(){ int n; cin>>n; int cnt=1;//代表存进树中的节点数 cin>>a; //第一行必为根节点,先单独赋值 tre[1].data=a[0]; if(a[1]!='*'){//代表有左儿子 tre[1].l=++cnt; tre[cnt].data=a[1]; } if(a[2]!='*'){//代表有右儿子 tre[1].r=++cnt; tre[cnt].data=a[2]; } for(int i=2;i<=n;i++){ cin>>a; for(int i=1;i<=cnt;i++){ if(tre[i].data==a[0]){//找这次读入的匹配树中哪一个节点 if(a[1]!='*'){//代表有左儿子 tre[i].l=++cnt; tre[cnt].data=a[1]; } if(a[2]!='*'){//代表有右儿子 tre[i].r=++cnt; tre[cnt].data=a[2]; } } } } preorder(1); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 4:06:11

掩日工具深度解析:红队必备的反病毒规避实战指南

掩日工具深度解析&#xff1a;红队必备的反病毒规避实战指南 【免费下载链接】AV_Evasion_Tool 掩日 - 免杀执行器生成工具 项目地址: https://gitcode.com/gh_mirrors/ave/AV_Evasion_Tool 掩日工具作为一款专业的反病毒规避解决方案&#xff0c;已经成为红队操作中不可…

作者头像 李华
网站建设 2026/3/4 2:29:09

深入浅出screen命令语法:常用选项与实例对照表

屏幕不断&#xff1f;任务中断&#xff1f;一招搞定&#xff1a;深入掌握screen命令的实战艺术你有没有遇到过这样的场景&#xff1a;深夜&#xff0c;你在远程服务器上启动了一个数据库迁移脚本&#xff0c;预计运行6小时。你放心地合上笔记本&#xff0c;准备第二天继续跟进—…

作者头像 李华
网站建设 2026/2/24 16:25:22

利用PaddlePaddle镜像实现OCR识别的完整案例分享

利用PaddlePaddle镜像实现OCR识别的完整案例分享 在日常办公、金融审核或档案管理中&#xff0c;我们常常需要从扫描件、照片甚至模糊截图中提取文字信息。传统方式依赖人工录入&#xff0c;效率低、成本高&#xff1b;而通用OCR工具面对中文复杂排版、手写体、低分辨率图像时又…

作者头像 李华
网站建设 2026/3/4 2:29:22

LeechCore物理内存获取突破性技术:深度解析与实践指南

LeechCore物理内存获取突破性技术&#xff1a;深度解析与实践指南 【免费下载链接】LeechCore LeechCore - Physical Memory Acquisition Library & The LeechAgent Remote Memory Acquisition Agent 项目地址: https://gitcode.com/gh_mirrors/le/LeechCore 面对日…

作者头像 李华
网站建设 2026/3/5 9:47:05

AI安全评估终极指南:HarmBench框架深度应用与实战技巧

在人工智能技术飞速发展的今天&#xff0c;如何确保AI系统的安全性已成为行业关注的焦点。随着大语言模型的广泛应用&#xff0c;恶意攻击者不断寻找系统弱点&#xff0c;传统的安全测试方法已难以应对复杂多变的攻击场景。 【免费下载链接】HarmBench HarmBench: A Standardiz…

作者头像 李华
网站建设 2026/2/28 8:36:02

Onivim 2 终极安装指南:解锁现代编辑器的完整潜力

作为一名追求效率的开发者&#xff0c;你是否曾在传统编辑器和现代IDE之间纠结&#xff1f;Onivim 2的出现完美解决了这一困境&#xff0c;它将Vim的模态编辑哲学与现代化开发工具无缝融合。本指南将带你从零开始&#xff0c;彻底掌握这款革命性编辑器的安装与配置技巧。 【免费…

作者头像 李华