刷题之FBI树

简介: 刷题之FBI树

84a50d407ff34fd18271cc2008b909dd.png

一、题目解读

看题目我们可以知道要先输入一个数N,再输入2^N个数。

这就告诉我们了,这是一颗满二叉树,N的范围0到10,也就是说这颗树总共有N+1层,最多是十一层,并且由我们输入了最后一层FBI树的值,然后题目要求我们写代码根据最后一层的FBI树的值去构建整棵树,再输出FBI树的后序遍历

全 “0” 串称为 B 串,全 “1” 串称为 I 串,既含 “0” 又含 “1” 的串则称为 F 串

二、思路分析

因为这棵树最多十一层,所以该颗树总共有2^10=1024,1024*2-1=2047个节点,我们取整2050(并且可以从下标为1开始存放FBI树的值),因此我们创建一个大小为2050的数组,去装下整颗树,创建一个大小为1025的数组,去存放最后一层的值。

构建完整的满二叉树:我们先要判断最后一层FBI树所对应的值,再一层层向上构建树,因为最后一层没有字节点了,所以最后一层是什么那它对应的FBI树的值就是什么,为’0‘就是B串,为’1‘就是I串。

 //root表示当前fbi树的根,left表示构建当前fbi树的s[]序列的左下标,right表示构建当前fbi树的s[]序列的右下标
    private static void build_FBI(int root, int left, int right) {
        //到达叶子结点
        if (right == left) {
            //判断当前节点的FBI属性
            if (s[left] == '0') {
                tree[root] = 'B';
            } else tree[root] = 'I';
            //返回
            return;
        }
        //分成两半 1 8   1-4  5-8
        int mid = (left + right) / 2;
        //递归左子
        build_FBI(2 * root, left, mid);
        //递归右子
        build_FBI(2 * root+1, mid+1, right);
        //左右儿子都是B
        if (tree[2 * root] == 'B' && tree[2 * root+1] == 'B') {
            tree[root] = 'B';
            //左右儿子都是I
        } else if (tree[2 * root] == 'I' && tree[2 * root+1] == 'I') {
            tree[root] = 'I';
        }else tree[root]='F';
    }

题目所给样例的递归过程如下:




001d94bf0b5f4debacda84c361952336.png



cada52125bd348618067cf7b374ffb8e.png

后序遍历: 在Java中数组未被赋值,会被默认赋值为零,除了String和boolean类型的数组。因此用0来判断当前数组的值是否为该满二叉树的值,来结束后续遍历递归,然后开始输出。

    //v表示后续遍历fbi树的根结点下标
    private static void postorder(int v) {
        // 在Java中数组未被赋值,会被默认赋值为零,除了String和boolean类型的数组,
        //因此用0来判断当前数组的值是否为该满二叉树的值
        //如果当前根结点有左子树,则后续遍历左子树
        if(tree[2*v]!=0){
            postorder(2 * v);
        }
        //如果当前根结点有右子树,则后续遍历右子树
        if(tree[2*v+1]!=0){
            postorder(2 * v+1);
        }
        //输出根信息
        System.out.print(tree[v]);
    }

三、代码

import java.util.Scanner;
public class Main{
    public static String read_str;
    public static final int TREE_SIZE=2050;
    public static final int S_SIZE=1025;
    public static char tree[]=new char[TREE_SIZE];//2050
    public static char s[]=new char[S_SIZE];//1024
    public static void main(String[] arge){
        Scanner sc = new Scanner(System.in);
        //读取n
        int n=sc.nextInt();
        //读取序列字符串
        String str=sc.next();
        //将读取的序列字符串存入s数组 1 8   1-4  5-8 //0-7   0-3   4-7
        for(int i=1;i<=str.length();i++){
            s[i]=str.charAt(i-1);
        }
        //递归调用方法来构建fbi树
        build_FBI(1,1,str.length());
        //递归调用方法来后续遍历fbi树
        postorder(1);
    }
    //v表示后续遍历fbi树的根结点下标
    private static void postorder(int v) {
        // TODO Auto-generated method stub
        //如果当前根结点有左子树,则后续遍历左子树
        if(tree[2*v]!=0){
            postorder(2 * v);
        }
        //如果当前根结点有右子树,则后续遍历右子树
        if(tree[2*v+1]!=0){
            postorder(2 * v+1);
        }
        //输出根信息
        System.out.print(tree[v]);
    }
    //root表示当前fbi树的根,left表示构建当前fbi树的s[]序列的左下标,right表示构建当前fbi树的s[]序列的右下标
    private static void build_FBI(int root, int left, int right) {
        // TODO Auto-generated method stub
        //到达叶子结点
        if (right == left) {
            //判断当前节点的FBI属性
            if (s[left] == '0') {
                tree[root] = 'B';
            } else tree[root] = 'I';
            //返回
            return;
        }
        //分成两半 1 8   1-4  5-8
        int mid = (left + right) / 2;
        //递归左子
        build_FBI(2 * root, left, mid);
        //递归右子
        build_FBI(2 * root+1, mid+1, right);
        //左右儿子都是B
        if (tree[2 * root] == 'B' && tree[2 * root+1] == 'B') {
            tree[root] = 'B';
            //左右儿子都是I
        } else if (tree[2 * root] == 'I' && tree[2 * root+1] == 'I') {
            tree[root] = 'I';
        }else tree[root]='F';
    }
}


目录
相关文章
|
传感器 存储 监控
自动施肥系统
自动施肥系统
271 2
|
10月前
|
人工智能 弹性计算 运维
操作系统控制台,让运维更简单!
操作系统控制台初体验,运维智能666!
426 37
操作系统控制台,让运维更简单!
|
9月前
|
小程序
微信小程序数据绑定与事件处理:打造动态交互体验
在上一篇中,我们学习了搭建微信小程序开发环境并创建“Hello World”页面。本文深入探讨数据绑定和事件处理机制,通过具体案例帮助你打造更具交互性的小程序。数据绑定使用双花括号`{{}}`语法,实现页面与逻辑层数据的动态关联;事件处理则通过`bind`或`catch`前缀响应用户操作。最后,通过一个简单的计数器案例,巩固所学知识。掌握这些核心技能,将助你开发更复杂的小程序。
|
缓存 Java 应用服务中间件
苍穹外卖知识点总结(springboot)
苍穹外卖知识点总结(springboot)
3093 0
|
人工智能 弹性计算 自然语言处理
AI奇思妙想之旅 —— 操作系统智能助手OS Copilot
AI奇思妙想之旅 —— 操作系统智能助手OS Copilot
485 1
|
算法 Java
【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化
【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化
508 0
|
编解码 前端开发 JavaScript
uniapp瀑布流布局写法
uniapp瀑布流布局写法
506 0
C/C++语言交换两个变量的七种方法
C/C++语言交换两个变量的七种方法
1226 0
C/C++语言交换两个变量的七种方法
|
消息中间件 缓存 Linux
RT-Thread记录(十、全面认识 RT-Thread I/O 设备模型)
学完 RT-Thread 内核,从本文开始熟悉了解 RT-Thread I/O 设备管理相关知识。
1064 0
RT-Thread记录(十、全面认识 RT-Thread I/O 设备模型)
|
消息中间件 存储 算法
G1垃圾收集器
G1垃圾收集器
1382 0
G1垃圾收集器