Donada la classe que permet gestionar arbres binaris usant memòria dinàmica, cal implementar el mètode
bool compleix_suma_fills();
que retorna si compleix la propietat ’Suma dels fills’: Per tot node el seu valor és igual a la suma dels valors dels nodes (arrels) del fill esquerre i del fill dret. Considera que els fills buits tenen un valor de node igual a 0, i que els nodes fulla sempre compleixen la propietat.
Cal enviar a jutge.org la següent especificació de la classe i la implementació del mètode dins del mateix fitxer.
#include <cstdlib>
#include <iostream>
using namespace std;
typedef unsigned int nat;
template <typename T>
class Abin {
public:
Abin(): _arrel(NULL) {};
// Pre: cert
// Post: el resultat és un arbre sense cap element
Abin(Abin<T> &ae, const T &x, Abin<T> &ad);
// Pre: cert
// Post: el resultat és un arbre amb un element i dos subarbres
// Les tres grans
Abin(const Abin<T> &a);
~Abin();
Abin<T>& operator=(const Abin<T>& a);
// operador << d'escriptura
template <class U> friend std::ostream& operator<<(std::ostream&, const Abin<U> &a);
// operador >> de lectura
template <class U> friend std::istream& operator>>(std::istream&, Abin<U> &a);
bool compleix_suma_fills() const;
// Pre: true
// Post: retorna si compleix la propietat 'Suma dels fills':
// Per tot node el seu valor és igual a la suma dels valors
// dels nodes (arrels) del fill esquerre i del fill dret.
private:
struct node {
node* f_esq;
node* f_dret;
T info;
};
node* _arrel;
static node* copia_nodes(node* m);
static void esborra_nodes(node* m);
static void print_nodes(node* m, ostream &os, string d1);
// Aquí va l'especificació dels mètodes privats addicionals
};
// Aquí va la implementació del mètode compleix\_suma\_fills i dels privats addicionals
Per testejar la solució, jutge.org ja té implementats la resta de mètodes de la classe i un programa principal que llegeix un arbre binari i desprès crida el mètode .
L’entrada consisteix en la descripció d’un arbre binari d’enters (el seu recorregut en postordre precedit per la mida de l’arbre). Per cada node s’indica el seu valor i el nombre de fills (2 fills, -1 indica un fill esquerra, 1 indica un fill dret o 0 fills). Per exemple, l’arbre (mira el PDF de l’enunciat)
es descriuria amb
10 4 0 7 1 2 0 0 2 4 0 1 0 6 1 7 -1 5 2 3 2
El contingut de l’arbre binari seguit d’un d’aquests dos textos:
L'arbre compleix la propietat 'Suma dels fills'.
L'arbre no compleix la propietat 'Suma dels fills'.
Només cal enviar la classe requerida i la implementació del mètode . Pots ampliar la classe amb mètodes privats. Segueix estrictament la definició de la classe de l’enunciat.
Input
6 3 0 5 0 8 2 2 0 2 -1 10 2
Output
[10]
\__[2]
| \__.
| \__[2]
| \__.
| \__.
\__[8]
\__[5]
| \__.
| \__.
\__[3]
\__.
\__.
L'arbre compleix la propietat 'Suma dels fills'.
Input
7 2 0 7 0 1 1 6 0 5 -1 6 2 8 2
Output
[8]
\__[6]
| \__[5]
| | \__.
| | \__[6]
| | \__.
| | \__.
| \__[1]
| \__[7]
| | \__.
| | \__.
| \__.
\__[2]
\__.
\__.
L'arbre no compleix la propietat 'Suma dels fills'.
Input
10 4 0 7 1 2 0 0 2 4 0 1 0 6 1 7 -1 5 2 3 2
Output
[3]
\__[5]
| \__[7]
| | \__.
| | \__[6]
| | \__[1]
| | | \__.
| | | \__.
| | \__.
| \__[4]
| \__.
| \__.
\__[0]
\__[2]
| \__.
| \__.
\__[7]
\__[4]
| \__.
| \__.
\__.
L'arbre no compleix la propietat 'Suma dels fills'.