Suma i mida de molts arbres (copy)

En aquest exercici, heu d’implementar un programa que llegeix comandes que manipulen variables que guarden àrbres binaris d’enters. La primera comanda numvars= nn ; indica el nombre total nn de variables. Els noms d’aquestes variables son t0,…,tn, i se suposa que inicialment cadascuna guarda un àrbre buit. Després venen comandes que construeixen nous àrbres a partir de variables i els assignen a variables (com per exemple t2 =BinTree( 3 , t0 , t1 );, i comandes que accedeixen als fills d’un arbre existent i els assignen a variables (com per exemple t3 = t2 .left(); o t3 = t2 .right();). També hi ha comandes per a escriure per la sortida un àrbre en INLINEFORMAT (com per exemple cout<< t2 ;), i instruccions per a escriure la mida o la suma dels valors d’un arbre guardat en una variable, com per exemple (cout<<size( t2 )<<endl; o cout<<sum( t2 );).

Aquest és un exemple d’entrada del programa:

numvars= 4 ;
t1 =BinTree( 1 , t2 , t3 );
t2 =BinTree( 2 , t1 , t3 );
t3 =BinTree( 3 , t2 , t1 );
cout<< t0 <<endl;
cout<< t1 <<endl;
cout<< t2 <<endl;
cout<< t3 <<endl;
cout<<size( t0 )<<endl;
cout<<size( t1 )<<endl;
cout<<size( t2 )<<endl;
cout<<size( t3 )<<endl;
cout<<sum( t0 )<<endl;
cout<<sum( t1 )<<endl;
cout<<sum( t2 )<<endl;
cout<<sum( t3 )<<endl;
t1 =BinTree( 1 , t2 , t3 );
t2 =BinTree( 2 , t1 , t3 );
t3 =BinTree( 3 , t2 , t1 );
cout<< t0 <<endl;
cout<< t1 <<endl;
cout<< t2 <<endl;
cout<< t3 <<endl;
cout<<size( t0 )<<endl;
cout<<size( t1 )<<endl;
cout<<size( t2 )<<endl;
cout<<size( t3 )<<endl;
cout<<sum( t0 )<<endl;
cout<<sum( t1 )<<endl;
cout<<sum( t2 )<<endl;
cout<<sum( t3 )<<endl;
t1 = t3 .left();
t2 = t1 .right();
t3 = t2 .left();
cout<< t0 <<endl;
cout<< t1 <<endl;
cout<< t2 <<endl;
cout<< t3 <<endl;
cout<<size( t0 )<<endl;
cout<<size( t1 )<<endl;
cout<<size( t2 )<<endl;
cout<<size( t3 )<<endl;
cout<<sum( t0 )<<endl;
cout<<sum( t1 )<<endl;
cout<<sum( t2 )<<endl;
cout<<sum( t3 )<<endl;

La sortida del programa amb la seqüència de comandes d’entrada anterior hauria de ser:

()
1
2(1,)
3(2(1,),1)
0
1
2
4
0
1
3
7
()
1(2(1,),3(2(1,),1))
2(1(2(1,),3(2(1,),1)),3(2(1,),1))
3(2(1(2(1,),3(2(1,),1)),3(2(1,),1)),1(2(1,),3(2(1,),1)))
0
7
12
20
0
11
20
34
()
2(1(2(1,),3(2(1,),1)),3(2(1,),1))
3(2(1,),1)
2(1,)
0
12
4
2
0
20
7
3

Com podeu observar a l’exemple d’entrada anterior, hi han espais en blanc per a facilitar la lectura. Podeu llegir i tractar les comandes així:

#include <iostream>
#include <string>
#include <cstdlib>
//...

using namespace std;

#include "BinTree.hh"

int getIdVar(string s)
{
	return atoi(s.substr(1).c_str());
}

//...

int main()
{
	//...
	string s1, s2, s3, s4, s5, s6, s7;
	int numvars;
	cin >> s1 >> numvars >> s2;
	// ...
	while (cin >> s1 >> s2) {
		if (s1[0] == 't') {
			int idvar = getIdVar(s1);
			if (s2 == "=BinTree(") {
				int value;
				cin >> value >> s3 >> s4 >> s5 >> s6 >> s7;
				int idvar1 = getIdVar(s4);
				int idvar2 = getIdVar(s6);
				//...
			} else if (s2 == "=") {
				cin >> s3 >> s4;
				int idvar1 = getIdVar(s3);
				if (s4 == ".left();") {
					//...
				} else {
					//...
				}
			}
		} else if (s1 == "cout<<") {
			int idvar = getIdVar(s2);
			cin >> s3;
			//...
			//....setOutputFormat(BinTree<int>::INLINEFORMAT);
			//cout << ... << endl;
		} else if (s1 == "cout<<size(") {
			int idvar = getIdVar(s2);
			cin >> s3;
			//...
		} else if (s1 == "cout<<sum(") {
			int idvar = getIdVar(s2);
			cin >> s3;
			//...
		}
	}
}

Fixeu-vos que l’enunciat d’aquest exercici us ofereix el fitxer BinTree.hh. Us falta crear el fitxer main.cc, que haurieu de construïr a partir de la plantilla que us hem oferit abans, fent un ús convenient del tipus BinTree. Només cal que pugeu main.cc al jutge.

Observació: Us recomanem que comenceu implementant una solució bàsica per tal de superar els jocs de proves públics i obtenir així la meitat de la nota. Ja la optimitzareu més endavant si teniu temps.

Entrada

La primera linia de l’entrada és de la forma numvars= LIMIT ;, a on LIMIT és un nombre natural positiu. Després venen instruccions d’aquestes menes:

tNUM =BinTree( VALUE , tNUM1 , tNUM2 );
tNUM1 = tNUM2 .left();
tNUM1 = tNUM2 .right();
cout<< tNUM <<endl;
cout<<size( tNUM )<<endl;
cout<<sum( tNUM )<<endl;

On VALUE es un enter i NUM, NUM1, NUM2 son naturals en el rang {0,…,LIMIT-1}.

Se suposa que les entrades son correctes: sempre es demana accedir a left o right d’arbres no buits, i no es produeixen errors d’overflow.

Sortida

Per a cada instrucció dels següents tres tipus, el vostre programa ha d’escriure el resultat esperat (l’arbre contingut en la variable en INLINEFORMAT, o la mida de l’arbre contingut en la variable, o la suma de l’arbre contingut en la variable, segons el cas).

cout<< tNUM <<endl;
cout<<size( tNUM )<<endl;
cout<<sum( tNUM )<<endl;

Observació

La solució d’aquest exercici s’ha de basar en un ús raonable del tipus BinTree. Qualsevol solució que ignori això i faci servir enfocaments o estructures de dades alternatives que no formen part de l’assignatura serà invalidada.

Avaluació sobre 10 punts:

Entenem com a solució ràpida una que és correcta, on cada operació té cost CONSTANT, 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.

Informació del problema

Autoria: PRO2

Generació: 2026-01-25T15:12:51.150Z

© Jutge.org, 2006–2026.
https://jutge.org