En aquest exercici considerarem arbres que tenen en els seus nodes els operands +,-,*, i valors numèrics. Per exemple, l’arbre -(+(+(5,2),-(3,4)),-(5,1)). També considerarem un valor independent que haurà de ser buscat a l’arbre.
EXERCICI:
Implementeu una funció que, donat un arbre binari de valors i els operands +,-,*, retorna el nivell en que es troba el numero buscat per primera vegada,comptant que l’arrel és el nivell 0, si aquest valor no està a l’arbre, ha de retornar -1 . Aquesta és la capçalera:
// Pre: t és un arbre no buit que representa una expressió correcta // sobre els naturals i els operadors +,-,*. // Les operacions no produeixen errors d'overflow. // Post: Retorna el nombre de subarbres de t que s'avaluen a x. int numberSubtreesEvaluateToParam(const BinaryTree<string> &t, int x){
Aquí tenim un exemple de paràmetre d’entrada de la funció i la corresponent sortida: int numberSubtreesEvaluateToParam(-(+(+(5,2),-(3,4)),-(5,1)), 6) = -1
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar per a compilar: Makefile, program.cpp, BinaryTree.hpp,numberSubtreesEvaluateToParam.hpp, utils.hpp, utils.cpp. Us falta crear el fitxer numberSubtreesEvaluateToParam.cpp amb els corresponents includes i implementar-hi la funció anterior. Valdrà la pena que utilitzeu algunes de les funcions oferides a utils.hpp. Quan pugeu la vostra solució al jutge, només cal que pugeu un tar construït així:
tar cf solution.tar numberSubtreesEvaluateToParam.cpp
Entrada
L’entrada té un nombre arbitrari de casos. Cada cas consisteix en una línia amb un string descrivint un arbre binari d’strings i també un valor independent que haurà de ser buscat a l’arbre. 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 Aqui teniu un exemple:
-(*(-(10,5),8),+(+(13,5),+(7,3))) 8
Sortida
Per a cada cas, la sortida conté el corresponent numero de nodes que es visita per trobar per primera vegada el valor que cal cercar dins de l’arbre. Fixeu-vos en que el programa que us oferim ja s’encarrega d’escriure aquest valor. Només cal que implementeu la funció abans esmentada. Aqui teniu la sortida esperada del programa anterior:
2
Input
-(+(+(5,2),-(3,4)),-(5,1)) 6 *(4,*(2,3)) 3 -(-(+(8,1),7),+(6,7)) 8 -(2,-(5,8)) 5 *(-(-(8,3),*(8,1)),-(4,*(8,5))) 8 +(4,4) 4 -(-(5,5),*(7,2)) 5 2 6 -(+(8,8),+(3,6)) 9 *(6,-(+(5,4),+(4,3))) 4
Output
-1 2 3 2 3 1 2 -1 -1 3
Input
+(5,2) 5 -(+(5,13),+(11,+(*(*(+(4,11),-(2,10)),-(*(2,12),-(6,6))),2))) 6 -(11,-(*(*(*(12,1),3),*(-(11,8),-(13,3))),*(1,11))) 1069 +(-(+(3,-(*(+(-(4,11),-(11,9)),*(-(2,12),-(1,6))),-(-(-(6,1),+(10,6)),+(-(8,9),8)))),-(-(*(3,1),+(-(+(6,5),13),*(13,10))),+(*(-(*(13,12),-(2,8)),*(4,3)),-(-(-(7,4),*(6,3)),11)))),*(7,-(-(4,*(+(-(9,2),*(4,7)),*(-(7,6),-(4,13)))),*(10,-(12,4))))) 12 +(-(-(-(+(4,*(7,*(13,2))),-(2,5)),-(11,8)),-(+(*(*(5,4),-(*(1,4),7)),-(7,*(5,10))),-(9,+(8,2)))),*(12,+(4,5))) -60 +(*(+(4,6),-(+(-(*(+(6,8),*(3,+(8,12))),13),+(5,8)),*(3,6))),-(11,2)) 8 -(*(-(*(8,4),*(7,5)),+(*(*(2,-(3,12)),*(-(1,3),*(4,4))),1)),+(-(*(12,-(-(1,8),*(3,8))),*(9,-(*(6,10),*(9,8)))),12)) 72 13 13 -(+(7,-(12,13)),*(3,+(+(7,5),-(3,6)))) -3 +(*(6,+(+(11,3),+(*(9,12),*(6,1)))),+(9,*(*(12,8),*(2,3)))) 9 +(-(-(+(10,9),+(11,10)),-(4,1)),*(-(*(1,9),9),+(*(2,10),-(*(12,7),8)))) 2 +(8,+(*(+(-(2,13),1),6),-(-(8,13),6))) 4 -(-(*(5,3),-(12,10)),+(-(-(-(*(12,-(12,10)),8),*(-(-(-(11,10),+(1,12)),6),+(3,4))),*(12,9)),-(6,10))) 2 -(*(-(10,5),8),+(+(13,5),+(7,3))) 8 -(+(+(-(-(5,1),+(6,4)),+(*(10,+(12,7)),*(2,-(3,1)))),+(-(10,-(*(+(5,11),*(*(7,4),*(2,7))),-(12,3))),*(6,3))),9) 7
Output
1 6 -1 7 -1 7 -1 0 -1 5 4 -1 -1 2 6