aeds2/fonte/u05 Árvores binárias/arvoreBinaria/cc/arvorebinaria.cc

205 lines
4.4 KiB
C++

/**
* Arvore binaria de pesquisa
* @author Max do Val Machado
*/
#include <err.h>
#include "arvorebinaria.h"
int ArvoreBinaria::soma(int a, int b){
return a+b;
}
/**
* Construtor da classe.
*/
ArvoreBinaria::ArvoreBinaria() {
raiz = NULL;
}
/**
* Metodo publico iterativo para pesquisar elemento.
* @param x Elemento que sera procurado.
* @return <code>true</code> se o elemento existir,
* <code>false</code> em caso contrario.
*/
bool ArvoreBinaria::pesquisar(int x) {
return pesquisar(x, raiz);
}
/**
* Metodo privado recursivo para pesquisar elemento.
* @param x Elemento que sera procurado.
* @param i No em analise.
* @return <code>true</code> se o elemento existir,
* <code>false</code> em caso contrario.
*/
bool ArvoreBinaria::pesquisar(int x, No* i) {
bool resp;
if (i == NULL) {
resp = false;
} else if (x == i->elemento) {
resp = true;
} else if (x < i->elemento) {
resp = pesquisar(x, i->esq);
} else {
resp = pesquisar(x, i->dir);
}
return resp;
}
/**
* Metodo publico iterativo para exibir elementos.
*/
void ArvoreBinaria::caminharCentral() {
cout << "[ ";
caminharCentral(raiz);
cout << "]\n";
}
/**
* Metodo privado recursivo para exibir elementos.
* @param i No em analise.
*/
void ArvoreBinaria::caminharCentral(No* i) {
if (i != NULL) {
caminharCentral(i->esq); // Elementos da esquerda.
cout << i->elemento << " "; // Conteudo do no.
caminharCentral(i->dir); // Elementos da direita.
}
}
/**
* Metodo publico iterativo para exibir elementos.
*/
void ArvoreBinaria::caminharPre() {
cout << "[ ";
caminharPre(raiz);
cout << "]\n";
}
/**
* Metodo privado recursivo para exibir elementos.
* @param i No em analise.
*/
void ArvoreBinaria::caminharPre(No* i) {
if (i != NULL) {
cout << i->elemento << " "; // Conteudo do no.
caminharPre(i->esq); // Elementos da esquerda.
caminharPre(i->dir); // Elementos da direita.
}
}
/**
* Metodo publico iterativo para exibir elementos.
*/
void ArvoreBinaria::caminharPos() {
cout << "[ ";
caminharPos(raiz);
cout << "]\n";
}
/**
* Metodo privado recursivo para exibir elementos.
* @param i No em analise.
*/
void ArvoreBinaria::caminharPos(No* i) {
if (i != NULL) {
caminharPos(i->esq); // Elementos da esquerda.
caminharPos(i->dir); // Elementos da direita.
cout << i->elemento << " "; // Conteudo do no.
}
}
/**
* Metodo publico iterativo para inserir elemento.
* @param x Elemento a ser inserido.
*/
void ArvoreBinaria::inserir(int x) {
inserir(x, raiz);
}
/**
* Metodo privado recursivo para inserir elemento.
* @param x Elemento a ser inserido.
* @param i No em analise.
*/
void ArvoreBinaria::inserir(int x, No* &i) {
if (i == NULL) {
i = new No(x);
} else if (x < i->elemento) {
inserir(x, i->esq);
} else if (x > i->elemento) {
inserir(x, i->dir);
} else {
errx(1, "Erro ao inserir!");
}
}
/**
* Metodo publico iterativo para remover elemento.
* @param x Elemento a ser removido.
*/
void ArvoreBinaria::remover(int x) {
remover(x, raiz);
}
/**
* Metodo privado recursivo para remover elemento.
* @param x Elemento a ser removido.
* @param i No em analise.
*/
void ArvoreBinaria::remover(int x, No* &i) {
if (i == NULL) {
errx(1, "Erro ao remover!");
} else if (x < i->elemento) {
remover(x, i->esq);
} else if (x > i->elemento) {
remover(x, i->dir);
// Sem no a direita.
} else if (i->dir == NULL) {
No* del = i;
i = i->esq;
delete del;
// Sem no a esquerda.
} else if (i->esq == NULL) {
No* del = i;
i = i->dir;
delete del;
// No a esquerda e no a direita.
} else {
maiorEsq(i, i->esq);
}
}
/**
* Metodo para trocar no removido pelo maior elemento da esquerda.
* @param i No que teve o elemento removido.
* @param j No da subarvore esquerda.
*/
void ArvoreBinaria::maiorEsq(No* i, No* &j) {
// Encontrou o maximo da subarvore esquerda.
if (j->dir == NULL) {
No* del = j;
i->elemento = j->elemento; // Substitui i por j.
j = j->esq; // Substitui j por j.ESQ.
delete del;
// Existe no a direita.
} else {
maiorEsq(i, j->dir); // Caminha para direita.
}
}