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 = 2047struct 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,则节点编号为Belse if(s[0] == '1')   node[id].val = 'I';  // 如果叶子为1,则节点编号为Ireturn 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,则当前节点的值也为Belse if( node[ node[id].lchild ].val == 'I' && node[ node[id].rchild ].val == 'I' )   node[id].val = 'I'; // 如果左右子树的值都为I,则当前节点的值也为Ielse node[id].val = 'F';   // 否则当前节点的值为Freturn 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring AI 第二讲 之 Chat Model API 第二节Ollama Chat

通过 Ollama&#xff0c;您可以在本地运行各种大型语言模型 (LLM)&#xff0c;并从中生成文本。Spring AI 通过 OllamaChatModel 支持 Ollama 文本生成。 先决条件 首先需要在本地计算机上运行 Ollama。请参阅官方 Ollama 项目 README&#xff0c;开始在本地计算机上运行模型…

curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL

source ~/.bash_profile flutter clean Command exited with code 128: git fetch --tags Standard error: 错误&#xff1a;RPC 失败。curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8) 错误&#xff1a;预期仍然需要 2737 个字节的正文 fetch-pack: unexpec…

GPT革命:AI如何重塑我们的未来!

GPT革命&#xff1a;AI如何重塑我们的未来&#xff01; &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享…

普通人也能弄的 16 个AI搞钱副业,门槛低,易上手!

大家好&#xff0c;我是灵魂画师向阳 本期给大家分享的是利用AI 做副业的一些方法&#xff0c;大家可以挑选适合自己的赛道去搞钱 现在是人工智能时代&#xff0c;利用好AI 工具&#xff0c;可以降低普通人做副业的门槛&#xff0c;同时也能提高工作效率&#xff0c; 因此AI …

【微机原理与汇编语言】循环程序设计

一、实验目的 1.熟练掌握8086/8088常用汇编指令的使用方法 2.熟练掌握循环结构程序编程技巧 3.熟练掌握汇编语言程序运行调试方法 二、实验要求 认真分析实验题目&#xff0c;设计程序流程图&#xff0c;独立完成代码编写及运行调试。 三、实验题目 给出不大于255的十个…

图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料

目录 01: 通用组件&#xff1a;input 构建方案分析 02: 通用组件&#xff1a;input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件&#xff1a;Dialog 构建方案分析 08: 通用组件&…

计算机组成原理·考点知识点整理

根据往年考试题&#xff0c;对考点和知识点的一个整理。 校验编码 码距 一种编码的最小码距&#xff0c;其实就是指这种编码的码距。码距有两种定义&#xff1a; 码距所描述的对象含义 2 2 2 个特定的码其二进制表示中不同位的个数一种编码这种编码中任意 2 2 2 个合法编码的…

【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程程序替换 1. 前言2. exec…

【JMeter接口自动化】第8讲 Fiddler抓包Jmeter

1&#xff09;配置好Fiddler 设置Fiddler-Tools-Options-HTTPS 设置Fiddler-Tools-Options-Connections&#xff0c;设置端口为8888 2&#xff09;查看IP 在CMD中输入ipconfig 查看IP地址 3&#xff09;配置Jmeter Http请求——基本&#xff0c;设置Http请求&#xff0c;使用…

轻量管理内核复杂级别的项目

在嵌入式开发中&#xff0c;管理大型项目&#xff08;例如Linux内核&#xff09;往往是一个复杂的过程。常规的版本控制系统如Git在处理小型项目时非常高效&#xff0c;但面对庞大的代码库时可能会显得笨重且占用大量存储空间。本文将介绍几种轻量级的方法来管理内核级别的项目…

Python 快速入门

1. 语言基础 1.1 数据类型与变量 Python 是一门动态类型语言&#xff0c;这意味着你不需要显式声明变量的类型。Python 解释器会根据你赋予变量的值自动推断其类型。这使得 Python 代码简洁易懂&#xff0c;但同时也需要注意一些潜在的问题。 1.1.1 Python 数据类型概述 Py…

408链表的创建和初始化

首先第一个头文件&#xff0c;定义结构体类型 typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //可能作为第一次写c语言的小伙伴看不懂这一段typedef是如何定义的 //基本的解释如下所示 //typedef struct LNode LNode; //typedef struct LNode* LinkL…

apex代码发送邮件时进行抄送

在 Salesforce 中使用 Apex 代码发送电子邮件时&#xff0c;可以通过 ccAddresses 属性来添加抄送&#xff08;CC&#xff09;收件人。以下是一个示例代码&#xff0c;展示了如何使用 Messaging.SingleEmailMessage 类来发送带有抄送的电子邮件。 示例代码 public class Emai…

北航数据结构与程序设计第四次作业选填题复习

首先都是线性的&#xff0c;线性包括顺序和链式&#xff0c;栈和队都可以用两种方式实现。栈只能存于栈顶取于栈顶&#xff0c;队列先进先出&#xff0c;因此存取点是固定的。 函数栈帧创建原理 画图即可。 A.显然不行&#xff0c;5如果第一个出来说明5是最后一个进的&#xf…

Lambda表达式与函数式工具在Python中的应用详解

目录 一、引言 二、Lambda表达式 Lambda表达式的定义 Lambda表达式的使用场景 Lambda表达式的示例 三、函数式工具 map()函数 filter()函数 reduce()函数 itertools模块 functools模块 四、Lambda表达式与函数式工具的结合使用 五、Lambda表达式与函数式工具的注意…

C语言面试题(拓展)

1、字符串中获取最长无重复字符子串。 要在字符串中找到最长的无重复字符的子串&#xff0c;可以使用滑动窗口技术。滑动窗口通过两个指针来表示当前窗口的起始和结束位置&#xff0c;并且维护一个哈希表来记录字符及其最后出现的位置&#xff0c;以此来确保字符不重复。 以下…

【云岚家政】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

Java Socket 网络编程实例(阻塞IO、非阻塞IO、多路复用Selector、AIO)

文章目录 1. 概述2. TCP 阻塞式IO 网络编程实例2.1 TCP网络编程服务端2.2 ByteBufferUtil2.3 客户端代码2.4 运行截图 3. TCP 非阻塞式IO 网络编程实例3.1 服务端3.2 客户端3.3 运行截图 4. 多路复用4.1 服务器端4.2 客户端4.3 运行截图 5. AIO5.1 AIO 服务端5.2 客户端5.3 运行…

C++笔试强训day39

目录 1.神奇的字母&#xff08;二&#xff09; 2.字符编码 3.最少的完全平方数 1.神奇的字母&#xff08;二&#xff09; 链接https://ac.nowcoder.com/acm/problem/205832 看输出描述即可知输出次数最多的那个字母即可。 哈希表直接秒了&#xff1a; #include <iostre…

一维时间序列突变检测方法(小波等,MATLAB R2021B)

信号的突变点检测问题是指在生产实践中&#xff0c;反映各种系统工作状态的信号&#xff0c;可能因为受到不同类型的噪声或外界干扰而发生了信号突变&#xff0c;导致严重失真的信号出现&#xff0c;因此必须探测突变出现的起点和终点。研究目的在于设计出检测方案&#xff0c;…