news 2026/5/1 4:29:27

二叉树输出(btout)(信息学奥赛一本通- P1366)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉树输出(btout)(信息学奥赛一本通- P1366)

【题目描述】

树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点的长度要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点的长度等于它的左右子树的长度之和。

一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始:

每行输出若干个结点字符(相同字符的个数等于该结点长度),

如果该结点有左子树就递归输出左子树;

如果该结点有右子树就递归输出右子树。

假定一棵二叉树一个结点用一个字符描述,现在给出先序和中序遍历的字符串,用树的凹入表示法输出该二叉树。

【输入】

两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的先序遍历和中序遍历的序列。

【输出】

行数等于该树的结点数,每行的字母相同。

【输入样例】

ABCDEFG CBDAFEG

【输出样例】

AAAA BB C D EE F G
/* //先建树(顺序存储),然后记录每个节点的度数,最后按先序遍历把每个节点 //输出,输出个数等于节点长度。但顺序存储不是很推荐,因为可能世代单传 #include <bits/stdc++.h> using namespace std; string a,b; struct node{ int l;//左儿子 int r;//右儿子 int len;//长度 char data;//字符 int parents; node(){ l=r=len=parents=0; } }tre[2000]; //后序遍历 计算每个节点的长度 void dfs(int root){ if(tre[root].l) dfs(root*2); if(tre[root].r) dfs(root*2+1); tre[tre[root].parents].len+=tre[root].len; } //先序遍历把每个节点输出,输出个数等于节点长度 void preorder(int root){ for(int i=1;i<=tre[root].len;i++) cout<<tre[root].data; cout<<endl; if(tre[root].l) preorder(root*2); if(tre[root].r) preorder(root*2+1); } //la代表这一轮先序遍历的起点,ra先序遍历的终点 //lb代表这一轮中序遍历的起点,rb中序遍历的终点 //k代表tre添加到了第k个节点 void build(int la,int ra,int lb,int rb,int k){ //找到这一轮的根节点在b中的位置 int root=b.find(a[la]); tre[k].data=a[la]; if(root>lb){//代表有左子树 tre[k].l=2*k; tre[2*k].parents=k; build(la+1,root+la-lb,lb,root-1,k*2); } if(root<rb){//代表有右子树 tre[k].r=2*k+1; tre[2*k+1].parents=k; build(root-lb+la+1,ra,root+1,rb,k*2+1); } } int main(){ cin>>a>>b;//先序遍历,中序遍历 build(0,a.size()-1,0,b.size()-1,1);//建树 //所有节点层次赋予之后,就可以开始赋值了,从叶子节点开始赋值,即最后一层开始赋值 for(int j=1;j<=1999;j++)//遍历每个元素,给所有叶子节点赋长度(1)1999表示遍历完整个tre if(tre[j].l==0 && tre[j].r==0) tre[j].len=1; dfs(1);//后序遍历计算每个节点的长度 preorder(1); return 0; } */ //先建树(链式存储),然后记录每个节点的度数,最后按先序遍历把每个节点输出,输出个数等于节点长度 #include <bits/stdc++.h> using namespace std; string a,b; int ind=1; struct node{ int l;//左儿子 int r;//右儿子 int len;//长度 char data;//字符 int parents; node(){ l=r=len=parents=0; } }tre[2000]; //后序遍历 计算每个节点的长度 void dfs(int root){ if(tre[root].l) dfs(tre[root].l); if(tre[root].r) dfs(tre[root].r); tre[tre[root].parents].len+=tre[root].len; } //先序遍历把每个节点输出,输出个数等于节点长度 void preorder(int root){ for(int i=1;i<=tre[root].len;i++) cout<<tre[root].data; cout<<endl; if(tre[root].l) preorder(tre[root].l); if(tre[root].r) preorder(tre[root].r); } //la代表这一轮先序遍历的起点,ra先序遍历的终点 //lb代表这一轮中序遍历的起点,rb中序遍历的终点 //k代表tre添加到了第k个节点 void build(int la,int ra,int lb,int rb,int k){ //找到这一轮的根节点在b中的位置 int root=b.find(a[la]); tre[k].data=a[la]; if(root>lb){//代表有左子树 tre[k].l=++ind; tre[ind].parents=k; build(la+1,root+la-lb,lb,root-1,ind); } if(root<rb){//代表有右子树 tre[k].r=++ind; tre[ind].parents=k; build(root-lb+la+1,ra,root+1,rb,ind); } } int main(){ cin>>a>>b;//先序遍历,中序遍历 build(0,a.size()-1,0,b.size()-1,1);//建树 //所有节点层次赋予之后,就可以开始赋值了,从叶子节点开始赋值,即最后一层开始赋值 for(int j=1;j<=a.size();j++)//遍历每个元素,给所有叶子节点赋长度(1)1999表示遍历完整个tre if(tre[j].l==0 && tre[j].r==0) tre[j].len=1; dfs(1);//后序遍历计算每个节点的长度 preorder(1); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 14:08:00

AI写论文哪个软件最好?别被“秒出万字”骗了——真正能交毕业论文的,只有它敢带真实图表、真实数据、真实文献

“AI写论文”广告铺天盖地&#xff1a; “3分钟生成全文”“一键搞定毕业论文”“导师看不出是AI写的”…… 但当你真拿它交初稿&#xff0c;才发现—— ❌ 参考文献是编的&#xff08;DOI查无此号&#xff09; ❌ 图表全是占位符或“AI幻想图” ❌ 数据“准确率98.7%”&#…

作者头像 李华
网站建设 2026/4/25 12:10:47

AI如何帮你快速分析Linux磁盘使用情况

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个AI驱动的Linux磁盘分析工具&#xff0c;能够自动扫描指定目录的磁盘使用情况&#xff0c;并以可视化图表展示占用空间最大的文件和目录。支持按大小、修改时间等维度排序&a…

作者头像 李华
网站建设 2026/4/26 16:08:31

用Wireshark快速验证网络服务的5种端口检测方法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个网络服务快速检测工具原型&#xff0c;集成Wireshark常用端口检测方案。用户选择服务类型&#xff08;如Web、邮件、数据库&#xff09;后&#xff0c;自动生成对应的过滤表…

作者头像 李华
网站建设 2026/4/28 3:43:43

ECMenu下载安装图文指南:小白也能轻松搞定

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个ECMenu下载安装向导程序&#xff0c;功能&#xff1a;1.图文步骤指引 2.自动检测系统环境 3.常见问题解答 4.一键式安装 5.使用入门视频。使用Electron开发跨平台应用&…

作者头像 李华
网站建设 2026/4/25 14:25:34

NX2306 STEP EXPORT FAIL 的问题解决办法

文章目录成功解决STEP EXPORT FAIL无法解决DXF/DWG EXPORT FAIL &#xff0c;认为是版本问题成功解决STEP EXPORT FAIL 经过下面这个方法成功解决&#xff1a; NX2306 STEP EXPORT FAIL NXNotification Center: Export STEP File - Export Failed Solution ① Exit NX ② Brow…

作者头像 李华
网站建设 2026/4/30 11:18:35

OpenCVSharp:学习人脸检测例子

前言 OpenCVSharp关于人脸检测提供了两个例子&#xff0c;一个是使用级联分类器另一个是使用DNN模型。 使用级联分类器 级联分类器&#xff08;Cascade Classifier&#xff09;是计算机视觉中一种高效的目标检测方法&#xff0c;特别广泛应用于人脸检测。 在这个例子中使用到了…

作者头像 李华