Cerca de subarbres binaris X09609


Statement
 

pdf   zip   tar

Considerem la representació habitual amb nodes de la clase Arbre per manegar arbres binaris genèrics d’elements de tipus T que podeu trobar als fitxers públics. Un arbre només té un atribut: un punter al primer node. Cada node conté la seva info i dos punters que representen els seus succesors.

Volem una nova operació de la classe que donat un arbre aa i un valor xx de tipus T comprovi si xx apareix en aa; cas que la cerca sigui exitosa, ha d’obtenir el subarbre que tingui com a arrel l’aparició d’xx més propera a l’arrel d’aa. Cas d’haver-hi diferents aparicions d’xx a la distància mínima, ha d’obtenir el subarbre de més a l’esquerra. Feu servir la següent especificació:

void sub_arrel(Arbre& asub, const T& x)
/* Pre: p.i. = A, asub es buit */
/* Post: si A conte x, asub es el subarbre d'A resultat de la cerca;
   si A no conte x, asub es buit */

Exemples: siguin els següents arbres d’enters

a =    7           b =    4           c =   10           d =   -4      
    /     \            /     \            /     \            /     \   
   6      -2          9       6         -1      -2          6      -2  
  / \     / \        / \     / \        /       / \        / \     /  
-2  -3  -1   3     -1   3   8  -3     -2      -1   3     -1   3   8   
                               /
                              1

llavors les instruccions a.sub_arrel(a1, -2), b.sub_arrel(b1, 1), c.sub_arrel(c1, 10), d.sub_arrel(d1, 6) han de produir els següents arbres

a =   -2       b =  1      c =   10           d =    6      
      / \                      /     \              / \   
    -1   3                   -1      -2           -1   3  
                             /       / \       
                           -2      -1   3      

Dissenyeu aquesta operació sense utilitzar cap de les operacions públiques del arbres binaris, accedint directament als atributs de la classe Arbre. Si que podeu fer servir l’operació privada

static node_arbre* copia_node_arbre(node_arbre* m) 
    /* Pre: cert */
    /* Post: el resultat es NULL si m es NULL;
       en cas contrari, el resultat apunta al node arrel 
       d'una jerarquia de nodes que es una copia de la
       jerarquia de nodes que te el node apuntat per m com a arrel */

Entrada

L’entrada és un arbre i un enter xx.

Sortida

La sortida és un subarbre de l’arbre d’entrada amb xx com a l’arrel amb les condicions de l’enunciat.

Observació

Només s’ha d’enviar un fitxer que contengui la funció amb la capçalera de l’enunciat i qualsevol altra funció auxiliar que cregueu convenient, sense la funció main i sense posar-hi cap “include”.

Information
Author
Alberto Moreno (adaptador), Ramon Ferrer i Cancho (responsable)
Language
Catalan
Official solutions
Unknown.
User solutions
C++