En aquest exercici haurem de crear un nou mètode
suma a la classe Arbre que rebrà un segon
Arbre com a paràmetre, i retornarà un tercer Arbre, és a dir, es podran
fer crides del tipus a1.suma(a2), i el
resultat també serà un Arbre. Aquest arbre resultant tindrà, com a
posicions, les posicions comunes de a1 i
a2, i en cada node hi tindrà la suma dels
nodes corresponents dels àrbres originals.
Com que el tipus T de la classe Arbre és
genèric, no necessàriament té definida la operació de suma. Els jocs de
proves treballen amb àrbres d’enters. Per tant, n’hi ha prou amb que
implementeu la funció suma de manera que
funcioni correctament quan T és
int.
Exemple: si tenim els arbres a1 i a2
a1 1 a2: 5
| |
--------- --------- --------- ---------
| | | |
2 1 4 6
| | | |
---- ---- ---- ---- ---- ----
| | | | | |
3 4 2 2 3 4
llavors la crida b=a1.suma(a2) haurà de retornar l’arbre b
b: 6
|
--------- ---------
| |
6 7
| |
---- ----
| |
5 6
D’entre els fitxers que s’adjunten en aquest exercici, trobareu
Arbre.hh, a on hi ha una implementació de la
classe genèrica Arbre binari. Haureu de buscar dins
Arbre.hh les següents línies:
// Pre: el p.i. i a són arbres de enters positius
// Post: Retorna la intersecció del p.i. i a, on cada node
// conté la suma dels nodes corresponents del p.i. i a
// Descomenteu les següents dues línies i implementeu el mètode:
// Arbre suma (const Arbre& a) const{
// }
Descomenteu les dues línies que s’indiquen i implementeu el mètode, fent servir l’operació privada que trobareu just després i que també haureu d’implementar. No toqueu la resta de la implementació de la classe.
La implementació d’aquest mètode hauria de consistir en accedir a nodes mitçançant punters. De fet, possiblement qualsevol altra implementació produïrà error d’execució.
Observació: Per a superar els jocs de proves privats convindrà evitar recórrer nodes dels arbres originals que no pertanyin a la intersecció.
D’entre els fitxers que s’adjunten a l’exercici també hi ha
main.cc (programa principal), i el podeu
compilar directament, doncs inclou Arbre.hh.
Només cal que pugeu Arbre.hh al jutge.
Cada cas consisteix en una descripció de dos arbres binaris d’enters positius. La descripció d’un arbre consisteix en un recorregut en preordre del nodes de l’arbre, amb marques on hi anirien els arbres buits. Fixeu-vos en que el programa que us oferim ja s’encarrega de llegir aquestes entrades. Només cal que implementeu la funció abans esmentada.
Per a cada cas, la sortida conté una descripció de la corresponent intersecció sumada dels arbres, amb el mateix format que l’input. Fixeu-vos en que el programa que us oferim ja s’encarrega d’escriure aquesta avaluació. Només cal que implementeu la funció abans esmentada.
La vostra funció i subfuncions que creeu han de treballar només amb arbres, punters i nodes d’arbre. Heu de trobar una solució RECURSIVA del problema.
Avaluació sobre 10 punts:
Solució lenta: 5 punts.
Solució ràpida: 10 punts.
Entenem com a solució ràpida una que és correcta, de cost lineal i que optimitza operacions booleanes, i capaç de superar els jocs de proves públics i privats. Entenem com a solució lenta una que no és ràpida, però és correcta i capaç de superar els jocs de proves públics.
Input
1 2 3 0 0 4 0 0 1 0 2 0 0 5 4 2 0 0 1 0 0 6 3 0 0 4 0 0
Output
6 6 5 0 0 5 0 0 7 0 6 0 0
Input
6 6 6 0 0 6 0 0 8 8 0 0 8 0 0 5 4 0 0 6 3 0 0 4 0 0
Output
11 10 0 0 14 11 0 0 12 0 0