蓝桥杯算法训练:FBI树(c++实现+图文详解)

news2024/10/2 8:31:17

文章目录

  • FBI树
    • C++代码示例

FBI树

题目要求

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
1)T的根结点为R,其类型与串S的类型相同;
2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

在这里插入图片描述

样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF


先来看输入的第一个数字:表示第二行输入字符串的长度是2^N,而第二行输入的字符串又代表着什么?

  • 字符串:表示每一个叶子节点所对应的字符,如上图所示。
  • 数字N: 表示叶子节点的个数,同时又可以计算出整棵树的节点的数量:2^(N+1)-1

如我们输入的数字3:表示叶子节点的深度是3,整棵树的节点数量是15(2^(N+1)-1)
同时输入的字符串又表示每一个叶子节点的字符。

所以我们就可以想到利用dfs,首先遍历到每一层的叶子节点,完成每一个叶子节点的赋值,接着递归返回根据两个叶子节点的值来判断每一棵子树的根节点的字符。

而我们又可以根据树的各层节点之间的数量关系来进行递归:
当前树节点:T(i),它的两个孩子节点:T(2i)T(2i+1)分别表示其左孩子和右孩子,我们根据其数字关系进行递归,我们用left 和 right分别表示其节点的所表示数字,什么时候到达叶子节点呢?当 left == right的时候,即表示到达了叶子节点,就可以完成对叶子节点的赋值操作(判断str的字符如果为‘1’则节点值为‘I’,否则为‘B’),当完成当前子树的叶子节点的赋值之后,回溯一层,完成对其根节点的赋值(左右孩子都为’I‘,值为’I‘;左右孩子都为’B’,值为‘B’;否则值为’F‘)

在这里插入图片描述
在这里插入图片描述

最后再完成一次后序遍历即可得到答案。


C++代码示例

#include<bits/stdc++.h>
using namespace std;

int n;
string s;
vector<char> vec(10005);
void dfs(int k,int left,int right)
{
	//递归到叶子节点,根据 s 的值来为叶子节点赋值
    if (left==right)
    {
        if (s[left]=='1')
        {
            vec[k]='I';
        }
        else
        {
            vec[k]='B';
        }
        return;
    }
    //一直递归下去,直到到达了叶子节点
    int mid=left+(right-left)/2;
    if (left!=right)
    {
        dfs(2*k,left,mid);
        dfs(2*k+1,mid+1,right);
    }

	//回溯过程:根据叶子节点的值来为当前子树的根节点赋值。
    if (vec[2*k]=='I' && vec[2*k+1]=='I')
    {
        vec[k]='I';
    }
    else if (vec[2*k]=='B' && vec[2*k+1]=='B')
    {
        vec[k]='B';
    }
    else
    {
        vec[k]='F';
    }
}
//后序遍历过程
void travel(int k)
{
    if (k>=pow(2,n+1))
    {
        return;
    }
    travel(2*k);
    travel(2*k+1);
    cout<<vec[k];
}
int main()
{
    cin>>n;
    cin>>s;
    dfs(1,0,s.size()-1);
    travel(1);
    return 0;
}

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

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

相关文章

某公司高管疾呼:底层程序员离职率太高,有人入职不到半年就走!建议把恶意离职加入征信,让年轻人对公司有起码的尊重!...

许多人入职后才发现公司有各种难以忍受的问题&#xff0c;入职时间很短就被迫离职&#xff0c;这本是无可奈何的事&#xff0c;但一位公司高管却对此非常愤怒&#xff0c;指出“目前基层程序员离职率太高&#xff0c;有人入职不到半年就走了”&#xff0c;还建议把恶意离职加入…

MVC开发模式

1、JSP演变历史 1、早期只有servlet&#xff0c;只能使用response输出标签数据&#xff0c;非常麻烦 2、后来又有了jsp&#xff0c;简化了Servlet的开发&#xff0c;但如果过度使用jsp&#xff0c;在jsp中即写大量的Java代码&#xff0c;又有HTML&#xff0c;会造成难以维护&am…

【红黑树】

红黑树红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入红黑树的验证红黑树的查找红黑树与AVL树的比较红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个结点上增加了一个存储位用于表示结点的颜色&#xff0c;这个颜色可以是红色的&#xff0c;也可以是黑色的&a…

主存储器扩展技术(计组)

用已有的存储器芯片构造一个需要的存储空间。 位扩展–扩展字长 构成内存的存储器芯片的字长小于内存单元要求的字长时–需要进行位扩展。实例&#xff1a; 位扩展的连线特点&#xff1a; 将每片的地址线、控制线并联&#xff0c;数据线分别引出。 效果&#xff1a; 存…

JavaSE笔记——函数式编程(流)

文章目录前言一、从外部迭代到内部迭代二、实现机制三、常用的流操作1.collect(toList())2.map3.filter4.flatMap5.max和min6.reduce四、多次调用流操作五、高阶函数总结前言 流是一系列与特定存储机制无关的元素——实际上&#xff0c;流并没有 “存储” 之说。利用流&#x…

如何用python打造新年氛围组?【内含html源码赠送】

嗨害大家好鸭&#xff01;我是小熊猫~ 离正式过新年还有24天~ 这次给大家整一个花活~ 就是每时每秒都提醒离新年还有多久 我这里还有一些中国结的python代码&#xff0c; 大家可以文末名片自行领取鸭~ 倒计时 效果展示 有什么python相关报错解答自己不会的、或者源码资料/…

操作系统——计算机系统概述

操作系统——计算机系统概述一、操作系统的概念1、定义2、功能和目标二 、操作系统特征1、并发性2、共享性3、虚拟性4、异步性三、操作系统的发展1、手工操作阶段2、批处理阶段——单道批处理系统2、批处理阶段——多道批处理系统3、实时操作系统四、运行机制和体系结构1、运行…

EnvironmentAware 接口的使用

文章目录1、EnvironmentAware 接口作用2、实际应用3、代码演示1&#xff09;基本配置准备2&#xff09;增加属性配置文件 application.properties3&#xff09;增加配置类实现 EnvironmentAware 接口4、编写 main 方法的类 SpringTest.java5、运行 main 方法查看结果1、Environ…

Java之线程状态

目录一、简介二、线程状态1、新建状态&#xff08;New&#xff09;2、运行状态&#xff08;Runnable&#xff09;3、阻塞状态&#xff08;Blocked/Waiting/TimeWaiting&#xff09;&#xff08;1&#xff09;被阻塞状态&#xff08;Blocked&#xff09;&#xff08;2&#xff0…

新新新~Revit插件【建模助手】7大模块介绍

年底了&#xff0c;大家是不是都在喝茶、聊天、等跨年&#xff1b;而我&#xff0c;建模助手&#xff0c;则在——总结、规划、PPT。 不盘不知道&#xff0c;一盘可吓了我一大跳&#xff01;没想到咱们在过去一年居然建设了这么多丰功伟绩&#xff1a; 说点标志性的&#xff…

到底什么是电子管(真空管)?

1883年&#xff0c;著名发明家托马斯爱迪生&#xff08;Thomas Edison&#xff09;在一次实验中&#xff0c;观察到一种奇怪现象。当时&#xff0c;他正在进行灯丝&#xff08;碳丝&#xff09;的寿命测试。在灯丝旁边&#xff0c;他放置了一根铜丝&#xff0c;但铜丝并没有接在…

WebRTC系列-视频VideoBroadcaster与视频流

文章目录 1. VideoBroadcaster 添加sink2. VideoBroadcaster 视频数据分发OnFrame方法在前面的文章视频的采集流程中,视频数据采集完成后到编码器之前,如果需要渲染处理那里需要两路视频,WebRTC是实现了一个视频分发器VideoBroadcaster;用来分发采集的视频帧; 这篇文章主要…

Nginx网页配置工具nginxWebUI

今天应该是我们公司 2022 年最后一天上班了&#xff0c;给自己做个简单的年度总结吧&#xff1a; 1月&#xff1a;做核酸 2月&#xff1a;做核酸 3月&#xff1a;做核酸&#xff0c;半个月左右居家办公 4月&#xff1a;做核酸&#xff0c;静态管理 5月&#xff1a;做核酸&…

贪吃蛇基础·框架版(简单)开头有原码

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

XStream < 1.4.20 栈缓冲区溢出漏洞

漏洞描述 XStream 是一个轻量级的、简单易用的开源Java类库&#xff0c;它主要用于将对象序列化成XML&#xff08;JSON&#xff09;或反序列化为对象。 在1.4.20之前的版本中存在栈缓冲区溢出漏洞&#xff0c;从而导致通过操纵已处理的输入流来造成拒绝服务。 在使用集合和映…

一文掌握FastDeploy Serving服务化部署(打造线上证件照制作系统,含完整代码)

目录一、概述1.1 服务化部署1.2 FastDeploy简介二、搭建线上证件照制作系统2.1 准备环境2.1.1 安装Docker2.1.2 安装NVIDIA Container Toolkit2.1.3 获取FastDeploy Serving镜像2.2 部署模型2.2.1 准备模型仓库2.2.2 编写配置文件config.pbtxt2.2.3 服务启动2.3.4 测试访问2.3 …

盒子模型、CSS 中选择器优先级以及权重计算、px、em 和 rem 的区别

CSS 的盒模型&#xff1f; 盒子模型&#xff08;Box Modle&#xff09;可以用来对元素进行布局&#xff0c;包括内边距&#xff0c;边框&#xff0c;外边距&#xff0c;和实际 内容这几个部分 盒子模型分为两种 第一种是 W3C 标准的盒子模型&#xff08;标准盒模型&#xff09;…

微软 Outlook 如何修改邮件列表中的字体或字号

因为电脑的操作系统是默认英文的&#xff0c;默认的字体实在是太难看了。 解决方案 我们是可以对字体进行修改的。 例如修改成下面的方案。 选择视图 首先&#xff0c;先选定顶部的视图。 然后在当前的视图下&#xff0c;选择视图设置。 随后在弹出的窗口中&#xff0c;选择…

一劳永逸解决latex 80%bug

Latex编辑器也用过很多了&#xff0c;这种问题出现&#xff0c;一般就是}没对应啥的&#xff0c;但是这次检查了半天&#xff0c;就是找不到问题。 最后有一个快捷的解决方案&#xff0c;就是overleafhttps://www.overleaf.com/project/6347bab20a4c120392547ff3 写文章五六年…

美颜sdk是如何美化皮肤的?

当下&#xff0c;互联网娱乐飞速发展&#xff0c;一些社交拍摄的平台逐渐爆火&#xff0c;例如短视频和直播类平台&#xff0c;此类平台基本都需要真人出镜&#xff0c;因此大家或多或少都有些“颜值焦虑”&#xff0c;平台方也正是因为这个原因&#xff0c;开始为大家接入美颜…