2004NOIP普及组真题 3. FBI树

线上OJ 地址:

[04NOIP普及组] FBI树

本题的意思是:给定一个 01字符串 (对应一棵完全二叉树的最后一层叶子节点),将树的每一个节点的值用字母“F、B、I”表示。规则(如下图所示)为:
1、如果树的左右子树的叶子节点都是0,则根节点为B;
2、如果树的左右子树的叶子节点都是1,则根节点为 I;
3、如果树的左右子树的叶子节点有0也有1,则根节点为 F;

在这里插入图片描述

核心思想:
1、由于给出的字符串长度为 2 N 2^N 2N,所以是满二叉树。可以每次 对左右两半 部分直接进行 递推建树
2、使用s.substr对字符串进行截取。substr 接收两个参数第一个参数是起始索引,第二个参数是截取长度。如果第二个参数不传,则默认截取到末尾。
3、牢记输出树的模板代码。核心在于 cout << node[r].val 的位置。这一行放前面就是前序遍历,放后面就是后续遍历,放中间就是中续遍历

题解代码:
#include <bits/stdc++.h>
using namespace std;

const int N = 2100;  // 满二叉树,节点总数为2^11 - 1 = 2047

struct Node
{
    int lchild, rchild; // 存储左子树和右子树的节点编号
    char val;
};
Node node[N];
int n, cnt; // cnt存储节点数量

int creatTree(string s)
{
    int id = ++cnt;  // 本节点的节点编号
    if(s.length() == 1) // 如果已经到了叶子节点(无法再分割)
    {
        if(s[0] == '0')  node[id].val = 'B';   // 如果叶子为0,则节点编号为B
        else if(s[0] == '1')   node[id].val = 'I';  // 如果叶子为1,则节点编号为I
        return id;
    }

    // 若不是边界,则区分成左右区间,进行递归。
    string s_l = s.substr(0, s.length()/2);  	// 左区间为从 0 开始,长度为 s.length()/2 , 实际到 s.length()/2 - 1。由于s是2^N,所以s.length()/2一定是整数,不存在向下取整
    string s_r = s.substr(s.length()/2); // 因为左区间到 s.length()/2 - 1,所以右区间为从 s.length()/2 开始,直到末尾

    node[id].lchild = creatTree(s_l);  // 根据左半段字符串,创建树,树的根节点为当前节点的左子树
    node[id].rchild = creatTree(s_r);  // 根据右半段字符串,创建树,树的根节点为当前节点的右子树

    if( node[ node[id].lchild ].val == 'B' && node[ node[id].rchild ].val == 'B' )   node[id].val = 'B';   // 如果左右子树的值都为B,则当前节点的值也为B
    else if( node[ node[id].lchild ].val == 'I' && node[ node[id].rchild ].val == 'I' )   node[id].val = 'I'; // 如果左右子树的值都为I,则当前节点的值也为I
    else node[id].val = 'F';   // 否则当前节点的值为F

    return id;
}

void postOrder(int r)  // 后续遍历输出
{
    if(r == 0)  return;

    postOrder( node[r].lchild );
    postOrder( node[r].rchild );
    cout << node[r].val;   // 关键在于这一行。这一行放前面就是前序遍历,放后面就是后续遍历,放中间就是中续遍历
}

int main()
{
    string s;
    cin >> n >> s;
    int root = creatTree(s);  // 创建树

    postOrder(root);  // 后续遍历输出树
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI大模型】Transformers大模型库(三):特殊标记(special tokens)

目录​​​​​​​ 一、引言 二、特殊标记&#xff08;special tokens&#xff09; 2.1 概述 2.2 主要功能 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预训练大模型提供预测、训练等服…

证件照太大了怎么压缩到100k?6个软件教你快速进行压缩

证件照太大了怎么压缩到100k&#xff1f;6个软件教你快速进行压缩 压缩证件照大小通常需要使用专门的图片压缩工具或者图片编辑软件。以下是六款常用的软件&#xff0c;它们可以帮助你快速压缩证件照大小到100KB以内&#xff1a; 1.迅捷压缩&#xff1a;这是一款图片压缩工具…

【javaEE初阶】

&#x1f308;&#x1f308;&#x1f308;关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE&#xff0c;一般称为java企业版&#xff0c;实际上java的历史可以追溯到上个世纪90年代&#xff0c;当时主要的语言主流的还是C语言和C&#xff0c;但是在那个时期嵌入式初…

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联&#xff0c;那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如&#xff0c;我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…

K8S==ingress配置自签名证书

安装openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 生成证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.local.key -out example.local.crt -subj "/CNexample.local/Oexample.local"创建K8S secr…

揭秘c语言储存类别

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文将整理c语言的储存类型的知识点 储存类型概念 描述:用于解决内存开辟与解放的时间的问题。跟作用域没啥关系。 但是呢&#xff0c;他也是能影响到程序的运行的&#xff0c;所以是很关键的。 类型: auto :自…

htb_solarlab

端口扫描 80,445 子域名扫描 木有 尝试使用smbclient连接445端口 Documents目录可查看 将Documents底下的文件下载到本地看看 xlsx文件里有一大串用户信息&#xff0c;包括username和password 先弄下来 不知道在哪登录&#xff0c;也没有子域名&#xff0c;于是返回进行全端…

flyfish3.0.0配置避坑

1.基础环境准备篇 doc/01-基础环境准备篇.md 云智慧/FlyFish - Gitee.com 使用教程里给出的java环境时&#xff0c;可以显示java版本&#xff0c;但是不能显示Maven的版本 改为&#xff1a; export NODE_HOME/usr/local/node/node-v14.19.3-linux-x64 export PATH$NODE_HOME…

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…

不是,有了这套IP地址管理开源系统谁还用Excel啊

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 中午好&#xff0c;我的网工朋友。 作为网工的我们想必都很清楚IP地址管理的重要性以及其复杂性&#xff0c;传统的Excel表格虽然在某些情况下能…

搭建大型分布式服务(三十九)SpringBoot 整合多个kafka数据源-支持Aware模式

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

YOLOv8+PyQt5苹果叶病害检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

效果视频&#xff1a;YOLOv8PyQt5苹果叶病害检测系统完整资源集合 资源包含可视化的苹果叶病害检测系统&#xff0c;基于最新的YOLOv8训练的苹果叶病害检测模型&#xff0c;和基于PyQt5制作的可视苹果叶病害系统&#xff0c;包含登陆页面和检测页面&#xff0c;该系统可自动检…

上位机图像处理和嵌入式模块部署(f407 mcu中的单独上位机烧录方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;stm32有三种烧录方法&#xff0c;一种是st-link v2&#xff0c;一种是dap&#xff0c;一种是j-link。不过我们在实际操作…

电阻、电容和电感测试仪设计

在现代化生产、学习、实验当中,往往需要对某个元器件的具体参数进行测量,在这之中万用表以其简单易用,功耗低等优点被大多数人所选择使用。然而万用表有一定的局限性,比如:不能够测量电感,而且容量稍大的电容也显得无能为力。所以制作一个简单易用的电抗元器件测量仪是很…

17K star,一款开源免费的手机电脑无缝同屏软件

导读&#xff1a;白茶清欢无别事&#xff0c;我在等风也等你。 作为程序员&#xff0c;在我们的工作中经常需要把手机投票到电脑进行调试工作&#xff0c;选择一款功能强大的投屏软件是一件很必要的事情。今天给大家介绍一款开源且免费的投屏软件&#xff0c;极限投屏&#xff…

json和axion结合

目录 java中使用JSON对象 在pom.xml中导入依赖 使用 public static String toJSONString(Object object)把自定义对象变成JSON对象 json和axios综合案例 使用的过滤器 前端代码 响应和请求都是普通字符串 和 请求时普通字符串&#xff0c;响应是json字符串 响应的数据是…

postman教程-14-生成随机数

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman关联接口的调用方法&#xff0c;本小节我们讲解一下Postman生成随机数的方法。 在接口测试中&#xff0c;经常需要向接口发送不同的输入数据&#xff0c;以确保接口的健壮性和可靠性。…

Vue3实战笔记(51)—Vue 3封装带均线的k线图

文章目录 前言带均线的k线图总结 前言 继续封装一个封装带均线的k线图 带均线的k线图 EChartsCandlestickSh.vue&#xff1a; <template><div ref"chartContainer" style"width: 100%; height: 500px"></div></template><scr…

HackTheBox-Machines--SolidState

SolidState 测试过程 1 信息收集 NMAP ┌──(root㉿serven)-[~] └─# nmap -p 0-65535 -A 10.129.224.177 Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-05 00:52 CST Host is up (0.063s latency). Not shown: 65530 closed tcp ports (reset) PORT STATE SE…

如何解决 Zabbix模板同步超时:解决运维技术领域的BugFailed to sync Zabbix template due to timeout

如何解决 Zabbix模板同步超时&#xff1a;解决运维技术领域的BugFailed to sync Zabbix template due to timeout 原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎…