[Grupo de divulgación NOIP2004] Solución recursiva del árbol del FBI

[Grupo de divulgación NOIP2004] Árbol del FBI

Descripción del Título:

Podemos dividir las cadenas compuestas por 0 y 1 en tres categorías: todas las cadenas 0 se denominan cadenas B, todas las cadenas 1 se denominan cadenas I y las cadenas que contienen tanto 0 como 1 se denominan cadenas F.

El árbol FBI es un árbol binario, y sus tipos de nodos también incluyen tres tipos: nodo F, nodo B y nodo I. Se puede construir un árbol FBI T a partir de una cadena 01 S con una longitud de $2^N$, y el método de construcción recursivo es el siguiente:

1. El nodo raíz de T es R, cuyo tipo es el mismo que el de la cadena S.
2. Si la longitud de la cadena S es mayor que 1, separe la cadena S por la mitad y divídala en las subcadenas izquierda y derecha S1 y S2 de igual longitud; la subcadena S1 construye el subárbol izquierdo T1 de R, y el subárbol derecho T2 de R se construye a partir de la subcadena derecha S2.

Ahora, dada una cadena 01 con una longitud de 2 ^ N, utilice el método de construcción anterior para construir un árbol FBI y generar su secuencia transversal posterior al pedido.

formato de entrada

La primera línea es un número entero N(0≤N≤10),

La segunda línea es una cadena 01 de longitud 2^N.

formato de salida

Una cadena, la secuencia transversal posterior a la orden del árbol del FBI.

Muestras de entrada y salida

Entrada #1:

3 
10001011

Salida #1:

IBFBBBFIBFIIIFF

Instrucciones/Consejos

Para %40% de los datos, N≤2;

N≤10 para todos los datos.

Pregunta 3 del grupo de divulgación noip2004.

La idea principal del tema:

 La idea general del tema es que dada una secuencia, como 10001011 , hemos separado la secuencia del medio, el subárbol izquierdo es el subárbol izquierdo y el subárbol derecho es el subárbol derecho, según si cada segmento es todo 0 y todo 1 o todo 10, hay valores F, B, I, construya un árbol binario y envíelo en orden inverso .

Enfoque de cola:

  Esta solución es un poco más complicada.

[Grupo de divulgación NOIP2004] Solución de cola de árbol del FBI icono-predeterminado.png?t=N4P3http://t.csdn.cn/ZLgIn

Enfoque recursivo:

Para el método de cola anterior, también tenemos un mejor algoritmo, que es resolver directamente recursivamente.

¿Por qué necesitamos obtener primero el arreglo transversal jerárquico y luego el recorrido posterior al orden? ¿Por qué el título nos pide que emitamos directamente el recorrido posterior al pedido?

Para un árbol FBI, si queremos obtener un recorrido posterior al pedido, por supuesto procesamos primero el nodo izquierdo, luego el nodo derecho y finalmente el nodo raíz, el nodo secundario,  y luego se procesa a sí mismo después de procesar el nodo secundario derecho

Entonces tenemos una idea:

Para un rango, podemos procesar el rango izquierdo de este rango y luego procesar el rango derecho, y cada rango siempre ingresa al rango izquierdo y finalmente llega al nodo hoja.Después de procesar el nodo hoja, volverá a la capa superior para procesar el nodo de hoja derecho Vuelva atrás y procese sus nodos principales, lo que resulta ser un recorrido posterior al pedido

Entonces, podemos escribir el siguiente código recursivo, siempre que el rango actual no sea un nodo hoja, continuaremos procesando el rango izquierdo y el rango derecho hasta l==r, lo que significa que solo necesitamos juzgar si es 1 o 0 de salida es suficiente, y luego vuelve a procesar el nodo correcto. Después de eso, el programa volverá al nodo principal y luego continuará juzgando si el rango es F, B o I.

#include<bits/stdc++.h>
using namespace std;
int n;
char t[1050];
void FBI(int l,int r){
    if(l<r){
        FBI(l,(l+r)/2);
        FBI((l+r)/2+1,r);
    }
    bool f1=1,f2=1;
    for(int i=l;i<=r;i++){
        if(t[i]=='1') 
		  f1 = 0;
        else if(t[i]=='0') 
		  f2=0;
    }
    if(!f1&&!f2)
      printf("F");
    else if(f2&&!f1)
      printf("I");
    else if(f1&&!f2)
      printf("B");
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=pow(2,n);i++)
      cin>>t[i];
    FBI(1,pow(2,n));
    return 0;
}

Resumir:

   Con base en nuestra solución de cola más complicada anterior, podemos obtener una solución recursiva más simple después de un pensamiento profundo.

Enlace del tema:

[Grupo de divulgación NOIP2004] Árbol del FBI - Luogu https://www.luogu.com.cn/problem/P1087

Supongo que te gusta

Origin blog.csdn.net/wo_ai_luo_/article/details/130934024
Recomendado
Clasificación