Árboles en el nivel HDU - 1622 二叉树

Los árboles son fundamentales en muchas ramas de la informática. Las computadoras paralelas actuales de última generación, como el CM-5 de Thinking Machines, se basan en árboles gordos. Los árboles cuádruples y octales son fundamentales para muchos algoritmos en gráficos de computadora. 

Este problema implica construir y atravesar árboles binarios. 
Dada una secuencia de árboles binarios, debe escribir un programa que imprima un recorrido de orden de nivel de cada árbol. En este problema, cada nodo de un árbol binario contiene un número entero positivo y todos los árboles binarios tienen menos de 256 nodos. 

En un recorrido de orden de nivel de un árbol, los datos en todos los nodos en un nivel dado se imprimen en orden de izquierda a derecha y todos los nodos en el nivel k se imprimen antes que todos los nodos en el nivel k + 1. 

Por ejemplo, un recorrido de orden de nivel del árbol 

 
es: 5, 4, 8, 11, 13, 4, 7, 2, 1. 

En este problema, un árbol binario se especifica mediante una secuencia de pares (n, s) donde n es el valor en el nodo cuya ruta desde el la raíz viene dada por la cadena s. Una ruta se da como una secuencia de L y R donde L indica una rama izquierda y R indica una rama derecha. En el árbol diagramado anteriormente, el nodo que contiene 13 está especificado por (13, RL), y el nodo que contiene 2 está especificado por (2, LLR). El nodo raíz se especifica mediante (5,) donde la cadena vacía indica la ruta desde la raíz hasta sí misma. Se considera que un árbol binario está completamente especificado si cada nodo en todas las rutas de raíz a nodo en el árbol recibe un valor exactamente una vez. 

Entrada La entrada es una secuencia de árboles binarios especificados como se describe anteriormente. Cada árbol en una secuencia consta de varios pares (n, s) como se describió anteriormente, separados por espacios en blanco. La última entrada en cada árbol es (). No aparece ningún espacio en blanco entre paréntesis izquierdo y derecho. 

Todos los nodos contienen un número entero positivo. Cada árbol en la entrada consistirá en al menos un nodo y no más de 256 nodos. La entrada finaliza al final del archivo. 

Salida Para cada árbol binario completamente especificado en el archivo de entrada, se debe imprimir el recorrido de orden de nivel de ese árbol. Si un árbol no está completamente especificado, es decir, a algún nodo en el árbol NO se le da un valor o a un nodo se le da un valor más de una vez, entonces la cadena `` no completa '' debe imprimirse.

(11, LL) (7, LLL) (8, R) 
(5,) (4, L) (13, RL) (2, LLR) (1, RRR) (4, RR) () 
(3, L ) (4, R) ()

Salida de muestra

5 4 8 11 13 4 7 2 1 
no completado
Este problema requiere construir un árbol binario y atravesarlo. 
Dadas algunas secuencias de árbol binario, debe generar la secuencia transversal de secuencia de cada árbol binario. El número de nodos en cada árbol no supera los 256. 

La secuencia transversal es de arriba a abajo, y la misma capa se emite de izquierda a derecha. 

Por ejemplo, 


el resultado de la secuencia de recorrido es: 5, 4, 8, 11, 13, 4, 7, 2, 1. 

(n, s) n es el valor del nodo, y s es el camino desde el nodo raíz hasta el punto. s se compone de 'L' y 'R', L representa la rama izquierda y R representa la rama derecha. En la figura anterior, el nodo 13 se representa como (13, RL) y el nodo 2 se representa como (2, LLR). El nodo raíz 5 se representa como (5,) y la ruta del nodo raíz está vacía. Un árbol binario se considera "completo" cuando cada ruta desde el nodo raíz corresponde a un solo valor. 

La entrada de entrada contiene múltiples conjuntos de datos y cada árbol recibe una serie de pares (n, s). La etiqueta final es (). No hay espacio entre cada par de paréntesis. 

Cada nodo contiene un entero positivo. Cada árbol de entrada contiene al menos un nodo y no más de 256 nodos. EOF significa que todas las entradas terminan. 

Salida Para cada árbol "completo", envíe los resultados de su secuencia de recorrido. Si un árbol no está "completo", es decir, un nodo en el árbol no tiene un valor dado o el valor de un nodo dado excede una vez, entonces se emite `` no completo ''.
// #include <bits / stdc ++. h> 
#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include <cstring> 
#include <algorithm> 
#include <queue> 
#include <map>
 usando el  espacio de nombres std; 
typedef largo  largo ll;
const ll inf = 1e13;
const  int mod = 1000000007 ;
const  int mx = 256 + 5 ; // verifica los límites, dummy 
typedef pair < int ,int > pa;
const  doble PI = acos (- 1 ); 
ll mcd (ll a, ll b) { return b? mcd (b, a% b): a; }
 #define swa (a, b) a ^ = b ^ = a ^ = b
 #define re (i, a, b) for (int i = (a), _ = (b); i <_; i ++)
 #define rb (i, a, b) para (int i = (b), _ = (a); i> = _; i--)
 #define clr (a) memset (a, 0, sizeof (a) )
 #define lowbit (x) ((x) & (x-1))
 #define mkp make_pai
 // void sc (int & x) {scanf ("% d", & x); } void sc (int64_t & x) {scanf ("% lld", & x); } void sc (doble & x) {scanf ("% lf", & x); } void sc (char & x) {scanf ("% c", & x); 
} void sc (char * x) {scanf ("% s", x); } intn, m, k;
struct node 
{ 
    bool isAssign;
    int val; 
    nodo * izquierda; 
    nodo * derecho; 
    nodo (): isAssign ( 0 ), izquierda (NULL), derecha (NULL) {} 
}; 
nodo * raíz;
bool falló; 
nodo * newnode () {
     return  nuevo nodo; 
} 
void removeTree (nodo * p) {
     if (p == NULL) return ; 
    removeTree (p -> izquierda); 
    removeTree (p ->derecho);
    eliminar p; 
} 
void insertNode ( int val, char * seq) {
     int n = strlen (seq); 
    nodo * p = raíz; 
    re (i, 0 , n) {
         if (seq [i] == ' L ' ) {
             if (p-> left == NULL) { 
                p -> left = newnode (); 
            } 
            p = p-> izquierda; 
        } 
        else  if (seq [i] == ' R ') {
             if (p-> right == NULL) { 
                p -> right = newnode (); 
            } 
            p = p-> derecha; 
        } 
    } 
    if (p-> isAssign) { 
        falló = 1 ; 
    } 
    p -> val = val; 
    p -> isAssign = 1 ; 
} 
char s [mx];
bool read () { 
    removeTree (root); 
    fallido = 0 ; 
    root = newnode ();
    mientras( 1 ) {
         if (scanf ( " % s " , s)! = 1 ) {
             return  0 ; 
        } 
        if (! strcmp (s, " () " )) {
             break ; 
        } 
        int val; 
        sscanf ( & s [ 1 ], " % d " , & val); 
        insertNode (val, strchr (s, ' , ' ) + 1 ); 
    } 
    retorno  1 ; 
} 
boolbfs (vector < int > & ans) { 
    cola <nodo *> q; //
     ans.clear (); 
    q.push (raíz); 
    while (! q.empty ()) { 
        nodo * p = q.front (); 
        q.pop (); 
        if (! p-> isAssign) {
             return  0 ; 
        } 
        ans.push_back (p -> val);
        if (p-> left! = NULL) { 
            q.push (p -> left); 
        } 
        if (p-> right! = NULL) { 
            q.push (p ->  right);
        }
    } 
    retorno  1 ; 
} 
int main () 
{ 
    ios :: sync_with_stdio ( false ); cin.tie ( 0 ); cout.tie ( 0 ); 
    vector < int > ans;
    while (read ()) 
    { 
        if (! bfs (ans)) { 
            falló = 1 ; 
        } 
        if (fallido) { 
            cout << " no completado " << endl; 
        } 
        else  {
            re (i, 0, ans.size ()) {
                 if (i! = 0 ) { 
                    cout << '  ' ; 
                } 
                cout << ans [i]; 
            } 
            cout << endl; 
        } 
    } 
    devuelve  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/xxxsans/p/12741221.html
Recomendado
Clasificación