news 2026/4/15 11:22:20

二叉树输出(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/15 9:28:35

写论文软件哪个好?别被“秒出全文”迷惑——真正能陪你从开题到答辩的,只有它把AI当“科研协作者”,而非“代笔枪手”

“写论文软件哪个好&#xff1f;” 这个问题在毕业季刷爆高校论坛。 你点开推荐列表&#xff0c;满屏都是&#xff1a;“3分钟生成万字论文”“导师看不出是AI写的”“毕业无忧神器”…… 但真相是—— 这些工具生成的“论文”&#xff0c;往往文献是编的、图是假的、数据是幻…

作者头像 李华
网站建设 2026/4/14 10:32:10

从手动编写到AI生成:Redux开发效率提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请分别用传统手动编写和使用AI生成两种方式实现相同的Redux功能&#xff1a;用户认证系统。要求包含&#xff1a;登录、登出、token刷新、权限验证等功能。完成后请对比两种方式的代…

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

3分钟快速搭建MySQL8开发环境:Docker极简方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请设计一个极简的Docker MySQL8开发环境方案&#xff0c;要求&#xff1a;1. 最简配置(单容器) 2. 预置常用配置 3. 包含示例数据库 4. 一键启动脚本 5. 快速连接指南 6. 资源占用最…

作者头像 李华
网站建设 2026/4/10 17:45:09

使用帧加载vue组件

背景首页渲染页面的时候&#xff0c;因为加载的元素特别多&#xff0c;页面会出现白屏解决方案使用浏览器的API requestAnimationFrame&#xff0c; 比如每一帧加载一个组件&#xff0c;依次加载所有的组件举例说明目录结构components--HeavyComp.vue APP.vue useDefer.jsuseDe…

作者头像 李华
网站建设 2026/4/13 3:50:59

设计师必备:用Snipaste快捷键提升10倍截图效率

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Snipaste高级使用指南网页应用&#xff0c;包含&#xff1a;1.设计工作流中的5个典型截图场景案例 2.每个案例的详细快捷键操作步骤分解 3.操作过程动画演示 4.效率对比数据…

作者头像 李华
网站建设 2026/4/14 18:09:58

文件处理12.17

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSV数据筛查工具 - 提取车机号</title><…

作者头像 李华