classTABBCalendario { // Sobrecarga del operador salida friend std::ostream &operator<<(std::ostream &, const TABBCalendario &); friendclassTNodoABB; private: // Puntero al nodo TNodoABB *raiz; // AUXILIAR: devuelve el recorrido en INORDEN voidInordenAux(TVectorCalendario &, int &)const; // AUXILIAR: devuelve el recorrido en PREORDEN voidPreordenAux(TVectorCalendario &, int &)const; // AUXILIAR: devuelve el recorrido en POSTORDEN voidPostordenAux(TVectorCalendario &, int &)const; // Copia de un árbol voidcopyNode(const TNodoABB *); voiddeleteNode(TNodoABB *); public: // Constructor por defecto TABBCalendario(); // Constructor de copia TABBCalendario(const TABBCalendario &); // Destructor ~TABBCalendario(); // Sobrecarga del operador asignación TABBCalendario &operator=(const TABBCalendario &); // Sobrecarga del operador igualdad booloperator==(const TABBCalendario &) const; // Devuelve TRUE si el árbol está vacío, FALSE en caso contrario boolEsVacio()const; // Inserta el elemento en el árbol boolInsertar(const TCalendario &); // Borra el elemento en el árbol boolBorrar(const TCalendario &); // Devuelve TRUE si el elemento está en el árbol, FALSE en caso contrario boolBuscar(const TCalendario &)const; // Devuelve el elemento de la raíz del árbol TCalendario Raiz()const; // Devuelve la altura del árbol (la altura de un árbol vacío es 0) intAltura()const; // Devuelve el número de nodos del árbol (un árbol vacío posee 0 nodos) intNodos()const; // Devuelve el número de nodos hoja en el árbol (la raíz puede ser nodo hoja) intNodosHoja()const; // Devuelve el recorrido en INORDEN sobre un vector TVectorCalendario Inorden()const; // Devuelve el recorrido en PREORDEN sobre un vector TVectorCalendario Preorden()const; // Devuelve el recorrido en POSTORDEN sobre un vector TVectorCalendario Postorden()const; // Devuelve el recorrido en NIVELES sobre un vector TVectorCalendario Niveles()const;
// Suma de dos ABB TABBCalendario operator+(const TABBCalendario &) const; // Resta de dos ABB TABBCalendario operator-(const TABBCalendario &) const; // --------------------- TVectorCalendario ABBCamino(TListaCalendario &l); TABBCalendario invertTree(const TABBCalendario &)const; voidgetCamino(const TCalendario &, TVectorCalendario &)const; // Binary Tree Level Order Traversal TVectorCalendario levelOrder()const; TCalendario findBottomLeftValue()const; };
bool TABBCalendario::Insertar(const TCalendario &tc) { /* Procedimiento: comprobar que la raiz actual de this es vacio or no. Si lo es, insertar, si no lo es, resursividad. recursividad lo hace que comprobar varias veces si la raiz actual de this anterior es vacio o no. si lo es, insertar */ if (this->raiz == nullptr) { this->raiz = new TNodoABB(); this->raiz->item = tc; return true; } if (this->raiz->item == tc) { return false; } if (this->raiz->item > tc) { return this->raiz->left.Insertar(tc); } if (this->raiz->item < tc) { return this->raiz->right.Insertar(tc); } return false; }
bool TABBCalendario::Buscar(const TCalendario &tc) const { if (this->raiz == nullptr) // si no lo encuentra entonces return false { returnfalse; } if (this->raiz->item == tc) // si lo encuentra entonces return true { returntrue; }
if (this->raiz->item < tc) // si el item de la raiz es menor que el tc, entonces buscar en la derecha { returnthis->raiz->right.Buscar(tc); } if (this->raiz->item > tc) // si el item de la raiz es mayor que el tc, entonces buscar en la izquierda { returnthis->raiz->left.Buscar(tc); } returnfalse; }
根节点
1 2 3 4 5 6 7 8 9 10
TCalendario TABBCalendario::Raiz() const { // un arbol solo tiene una raiz, si no lo hay, devolver un Tcalendario por defecto if (this->raiz != nullptr) { returnthis->raiz->item; } return TCalendario(); }
高度
1 2 3 4 5 6 7 8 9
int TABBCalendario::Altura() const { if (this->raiz == nullptr) { return0; } return1 + std::max(this->raiz->left.Altura(), this->raiz->right.Altura()); }
节点数
1 2 3 4 5 6 7 8
int TABBCalendario::Nodos() const { if (this->raiz == nullptr) { return0; } return1 + this->raiz->left.Nodos() + this->raiz->right.Nodos(); }
叶子节点数
1 2 3 4 5 6 7 8 9 10 11 12
int TABBCalendario::NodosHoja() const { if (this->raiz == nullptr) { return 0; } if (this->raiz->left.raiz == nullptr && this->raiz->right.raiz == nullptr) { return 1; } return this->raiz->left.NodosHoja() + this->raiz->right.NodosHoja(); }
TVectorCalendario TABBCalendario::Niveles() const { std::queue<TNodoABB *> q; // cola TVectorCalendario v(Nodos()); // crear un vector de tamanio de nodos int pos = 1;
if (this->raiz != nullptr) { q.push(this->raiz); }
while (!q.empty()) { TNodoABB *temp = q.front(); // coger el primer elemento de la cola q.pop(); // borrar el primer elemento de la cola v[pos] = temp->item; // poner el item de ese nodo en el vector pos++; // aumentar la posicion if (temp->left.raiz != nullptr) // si el nodo tiene un hijo izquierdo, ponerlo en la cola { q.push(temp->left.raiz); } if (temp->right.raiz != nullptr) // si el nodo tiene un hijo derecho, ponerlo en la cola { q.push(temp->right.raiz); } } return v; }