This commit is contained in:
Felipe Domingos 2021-11-15 15:59:52 -03:00
commit f041b8353d
1 changed files with 359 additions and 351 deletions

View File

@ -3,400 +3,408 @@
* @author Max do Val Machado * @author Max do Val Machado
*/ */
public class ArvoreBinaria { public class ArvoreBinaria {
private No raiz; // Raiz da arvore. private No raiz; // Raiz da arvore.
/** /**
* Construtor da classe. * Construtor da classe.
*/ */
public ArvoreBinaria() { public ArvoreBinaria() {
raiz = null; raiz = null;
} }
/** /**
* Metodo publico iterativo para pesquisar elemento. * Metodo publico iterativo para pesquisar elemento.
* @param x Elemento que sera procurado. * @param x Elemento que sera procurado.
* @return <code>true</code> se o elemento existir, * @return <code>true</code> se o elemento existir,
* <code>false</code> em caso contrario. * <code>false</code> em caso contrario.
*/ */
public boolean pesquisar(int x) { public boolean pesquisar(int x) {
return pesquisar(x, raiz); return pesquisar(x, raiz);
} }
/** /**
* Metodo privado recursivo para pesquisar elemento. * Metodo privado recursivo para pesquisar elemento.
* @param x Elemento que sera procurado. * @param x Elemento que sera procurado.
* @param i No em analise. * @param i No em analise.
* @return <code>true</code> se o elemento existir, * @return <code>true</code> se o elemento existir,
* <code>false</code> em caso contrario. * <code>false</code> em caso contrario.
*/ */
private boolean pesquisar(int x, No i) { private boolean pesquisar(int x, No i) {
boolean resp; boolean resp;
if (i == null) { if (i == null) {
resp = false; 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;
}
/** } else if (x == i.elemento) {
* Metodo publico iterativo para exibir elementos. resp = true;
*/
public void caminharCentral() {
System.out.print("[ ");
caminharCentral(raiz);
System.out.println("]");
}
/** } else if (x < i.elemento) {
* Metodo privado recursivo para exibir elementos. resp = pesquisar(x, i.esq);
* @param i No em analise.
*/
private void caminharCentral(No i) {
if (i != null) {
caminharCentral(i.esq); // Elementos da esquerda.
System.out.print(i.elemento + " "); // Conteudo do no.
caminharCentral(i.dir); // Elementos da direita.
}
}
/** } else {
* Metodo publico iterativo para exibir elementos. resp = pesquisar(x, i.dir);
*/ }
public void caminharPre() { return resp;
System.out.print("[ "); }
caminharPre(raiz);
System.out.println("]");
}
/** /**
* Metodo privado recursivo para exibir elementos. * Metodo publico iterativo para exibir elementos.
* @param i No em analise. */
*/ public void caminharCentral() {
private void caminharPre(No i) { System.out.print("[ ");
if (i != null) { caminharCentral(raiz);
System.out.print(i.elemento + " "); // Conteudo do no. System.out.println("]");
caminharPre(i.esq); // Elementos da esquerda. }
caminharPre(i.dir); // Elementos da direita.
}
}
/** /**
* Metodo publico iterativo para exibir elementos. * Metodo privado recursivo para exibir elementos.
*/ * @param i No em analise.
public void caminharPos() { */
System.out.print("[ "); private void caminharCentral(No i) {
caminharPos(raiz); if (i != null) {
System.out.println("]"); caminharCentral(i.esq); // Elementos da esquerda.
} System.out.print(i.elemento + " "); // Conteudo do no.
caminharCentral(i.dir); // Elementos da direita.
}
}
/** /**
* Metodo privado recursivo para exibir elementos. * Metodo publico iterativo para exibir elementos.
* @param i No em analise. */
*/ public void caminharPre() {
private void caminharPos(No i) { System.out.print("[ ");
if (i != null) { caminharPre(raiz);
caminharPos(i.esq); // Elementos da esquerda. System.out.println("]");
caminharPos(i.dir); // Elementos da direita. }
System.out.print(i.elemento + " "); // Conteudo do no.
} /**
} * Metodo privado recursivo para exibir elementos.
* @param i No em analise.
*/
private void caminharPre(No i) {
if (i != null) {
System.out.print(i.elemento + " "); // Conteudo do no.
caminharPre(i.esq); // Elementos da esquerda.
caminharPre(i.dir); // Elementos da direita.
}
}
/**
* Metodo publico iterativo para exibir elementos.
*/
public void caminharPos() {
System.out.print("[ ");
caminharPos(raiz);
System.out.println("]");
}
/**
* Metodo privado recursivo para exibir elementos.
* @param i No em analise.
*/
private void caminharPos(No i) {
if (i != null) {
caminharPos(i.esq); // Elementos da esquerda.
caminharPos(i.dir); // Elementos da direita.
System.out.print(i.elemento + " "); // Conteudo do no.
}
}
/** /**
* Metodo publico iterativo para inserir elemento. * Metodo publico iterativo para inserir elemento.
* @param x Elemento a ser inserido. * @param x Elemento a ser inserido.
* @throws Exception Se o elemento existir. * @throws Exception Se o elemento existir.
*/ */
public void inserir(int x) throws Exception { public void inserir(int x) throws Exception {
raiz = inserir(x, raiz); raiz = inserir(x, raiz);
} }
/** /**
* Metodo privado recursivo para inserir elemento. * Metodo privado recursivo para inserir elemento.
* @param x Elemento a ser inserido. * @param x Elemento a ser inserido.
* @param i No em analise. * @param i No em analise.
* @return No em analise, alterado ou nao. * @return No em analise, alterado ou nao.
* @throws Exception Se o elemento existir. * @throws Exception Se o elemento existir.
*/ */
private No inserir(int x, No i) throws Exception { private No inserir(int x, No i) throws Exception {
if (i == null) { if (i == null) {
i = new No(x); i = new No(x);
} else if (x < i.elemento) {
i.esq = inserir(x, i.esq);
} else if (x > i.elemento) {
i.dir = inserir(x, i.dir);
} else {
throw new Exception("Erro ao inserir!");
}
return i;
}
/** } else if (x < i.elemento) {
* Metodo publico para inserir elemento. i.esq = inserir(x, i.esq);
* @param x Elemento a ser inserido.
* @throws Exception Se o elemento existir.
*/
public void inserirPai(int x) throws Exception {
if(raiz == null){
raiz = new No(x);
} else if(x < raiz.elemento){
inserirPai(x, raiz.esq, raiz);
} else if(x > raiz.elemento){
inserirPai(x, raiz.dir, raiz);
} else {
throw new Exception("Erro ao inserirPai!");
}
}
/** } else if (x > i.elemento) {
* Metodo privado recursivo para inserirPai elemento. i.dir = inserir(x, i.dir);
* @param x Elemento a ser inserido.
* @param i No em analise. } else {
* @param pai No superior ao em analise. throw new Exception("Erro ao inserir!");
* @throws Exception Se o elemento existir. }
*/
private void inserirPai(int x, No i, No pai) throws Exception { return i;
if (i == null) { }
if(x < pai.elemento){
pai.esq = new No(x); /**
} else { * Metodo publico para inserir elemento.
pai.dir = new No(x); * @param x Elemento a ser inserido.
} * @throws Exception Se o elemento existir.
} else if (x < i.elemento) { */
inserirPai(x, i.esq, i); public void inserirPai(int x) throws Exception {
} else if (x > i.elemento) { if(raiz == null){
inserirPai(x, i.dir, i); raiz = new No(x);
} else { } else if(x < raiz.elemento){
throw new Exception("Erro ao inserirPai!"); inserirPai(x, raiz.esq, raiz);
} } else if(x > raiz.elemento){
} inserirPai(x, raiz.dir, raiz);
} else {
throw new Exception("Erro ao inserirPai!");
}
}
/**
* Metodo privado recursivo para inserirPai elemento.
* @param x Elemento a ser inserido.
* @param i No em analise.
* @param pai No superior ao em analise.
* @throws Exception Se o elemento existir.
*/
private void inserirPai(int x, No i, No pai) throws Exception {
if (i == null) {
if(x < pai.elemento){
pai.esq = new No(x);
} else {
pai.dir = new No(x);
}
} else if (x < i.elemento) {
inserirPai(x, i.esq, i);
} else if (x > i.elemento) {
inserirPai(x, i.dir, i);
} else {
throw new Exception("Erro ao inserirPai!");
}
}
/** /**
* Metodo publico iterativo para remover elemento. * Metodo publico iterativo para remover elemento.
* @param x Elemento a ser removido. * @param x Elemento a ser removido.
* @throws Exception Se nao encontrar elemento. * @throws Exception Se nao encontrar elemento.
*/ */
public void remover(int x) throws Exception { public void remover(int x) throws Exception {
raiz = remover(x, raiz); raiz = remover(x, raiz);
} }
/** /**
* Metodo privado recursivo para remover elemento. * Metodo privado recursivo para remover elemento.
* @param x Elemento a ser removido. * @param x Elemento a ser removido.
* @param i No em analise. * @param i No em analise.
* @return No em analise, alterado ou nao. * @return No em analise, alterado ou nao.
* @throws Exception Se nao encontrar elemento. * @throws Exception Se nao encontrar elemento.
*/ */
private No remover(int x, No i) throws Exception { private No remover(int x, No i) throws Exception {
if (i == null) { if (i == null) {
throw new Exception("Erro ao remover!"); throw new Exception("Erro ao remover!");
} else if (x < i.elemento) { } else if (x < i.elemento) {
i.esq = remover(x, i.esq); i.esq = remover(x, i.esq);
} else if (x > i.elemento) { } else if (x > i.elemento) {
i.dir = remover(x, i.dir); i.dir = remover(x, i.dir);
// Sem no a direita. // Sem no a direita.
} else if (i.dir == null) { } else if (i.dir == null) {
i = i.esq; i = i.esq;
// Sem no a esquerda. // Sem no a esquerda.
} else if (i.esq == null) { } else if (i.esq == null) {
i = i.dir; i = i.dir;
// No a esquerda e no a direita. // No a esquerda e no a direita.
} else { } else {
i.esq = maiorEsq(i, i.esq); i.esq = maiorEsq(i, i.esq);
} }
return i; return i;
} }
/** /**
* Metodo para trocar o elemento "removido" pelo maior da esquerda. * Metodo para trocar o elemento "removido" pelo maior da esquerda.
* @param i No que teve o elemento removido. * @param i No que teve o elemento removido.
* @param j No da subarvore esquerda. * @param j No da subarvore esquerda.
* @return No em analise, alterado ou nao. * @return No em analise, alterado ou nao.
*/ */
private No maiorEsq(No i, No j) { private No maiorEsq(No i, No j) {
// Encontrou o maximo da subarvore esquerda. // Encontrou o maximo da subarvore esquerda.
if (j.dir == null) { if (j.dir == null) {
i.elemento = j.elemento; // Substitui i por j. i.elemento = j.elemento; // Substitui i por j.
j = j.esq; // Substitui j por j.ESQ. j = j.esq; // Substitui j por j.ESQ.
// Existe no a direita. // Existe no a direita.
} else { } else {
// Caminha para direita. // Caminha para direita.
j.dir = maiorEsq(i, j.dir); j.dir = maiorEsq(i, j.dir);
} }
return j; return j;
} }
/** /**
* Metodo que retorna o maior elemento da árvore * Metodo que retorna o maior elemento da árvore
* @return int maior elemento da árvore * @return int maior elemento da árvore
*/ */
public int getMaior(){ public int getMaior(){
int resp = -1; int resp = -1;
if(raiz != null){
No i; if(raiz != null){
for(i = raiz; i.dir != null; i = i.dir); No i;
resp = i.elemento; for(i = raiz; i.dir != null; i = i.dir);
} resp = i.elemento;
return resp; }
}
return resp;
}
/** /**
* Metodo que retorna o menor elemento da árvore * Metodo que retorna o menor elemento da árvore
* @return int menor elemento da árvore * @return int menor elemento da árvore
*/ */
public int getMenor(){ public int getMenor(){
int resp = -1; int resp = -1;
if(raiz != null){
No i; if(raiz != null){
for(i = raiz; i.esq != null; i = i.esq); No i;
resp = i.elemento; for(i = raiz; i.esq != null; i = i.esq);
} resp = i.elemento;
return resp; }
}
return resp;
}
/** /**
* Metodo que retorna a altura da árvore * Metodo que retorna a altura da árvore
* @return int altura da árvore * @return int altura da árvore
*/ */
public int getAltura(){ public int getAltura(){
return getAltura(raiz, 0); return getAltura(raiz, 0);
} }
/**
* Metodo que retorna a altura da árvore
* @return int altura da árvore
*/
public int getAltura(No i, int altura){
if(i == null){
altura--;
} else {
int alturaEsq = getAltura(i.esq, altura + 1);
int alturaDir = getAltura(i.dir, altura + 1);
altura = (alturaEsq > alturaDir) ? alturaEsq : alturaDir;
}
return altura;
}
/** /**
* Metodo publico iterativo para remover elemento. * Metodo que retorna a altura da árvore
* @param x Elemento a ser removido. * @return int altura da árvore
* @throws Exception Se nao encontrar elemento. */
*/ public int getAltura(No i, int altura){
public void remover2(int x) throws Exception { if(i == null){
if (raiz == null) { altura--;
throw new Exception("Erro ao remover2!"); } else {
} else if(x < raiz.elemento){ int alturaEsq = getAltura(i.esq, altura + 1);
remover2(x, raiz.esq, raiz); int alturaDir = getAltura(i.dir, altura + 1);
} else if (x > raiz.elemento){ altura = (alturaEsq > alturaDir) ? alturaEsq : alturaDir;
remover2(x, raiz.dir, raiz); }
} else if (raiz.dir == null) { return altura;
raiz = raiz.esq; }
} else if (raiz.esq == null) {
raiz = raiz.dir;
} else {
raiz.esq = maiorEsq(raiz, raiz.esq);
}
}
/**
* Metodo privado recursivo para remover elemento.
* @param x Elemento a ser removido.
* @param i No em analise.
* @param pai do No em analise.
* @throws Exception Se nao encontrar elemento.
*/
private void remover2(int x, No i, No pai) throws Exception {
if (i == null) {
throw new Exception("Erro ao remover2!");
} else if (x < i.elemento) {
remover2(x, i.esq, i);
} else if (x > i.elemento) {
remover2(x, i.dir, i);
} else if (i.dir == null) {
pai = i.esq;
} else if (i.esq == null) {
pai = i.dir;
} else {
i.esq = maiorEsq(i, i.esq);
}
}
public int getRaiz() throws Exception { /**
return raiz.elemento; * Metodo publico iterativo para remover elemento.
} * @param x Elemento a ser removido.
* @throws Exception Se nao encontrar elemento.
*/
public void remover2(int x) throws Exception {
if (raiz == null) {
throw new Exception("Erro ao remover2!");
} else if(x < raiz.elemento){
remover2(x, raiz.esq, raiz);
} else if (x > raiz.elemento){
remover2(x, raiz.dir, raiz);
} else if (raiz.dir == null) {
raiz = raiz.esq;
} else if (raiz.esq == null) {
raiz = raiz.dir;
} else {
raiz.esq = maiorEsq(raiz, raiz.esq);
}
}
public static boolean igual (ArvoreBinaria a1, ArvoreBinaria a2){ /**
return igual(a1.raiz, a2.raiz); * Metodo privado recursivo para remover elemento.
} * @param x Elemento a ser removido.
* @param i No em analise.
* @param pai do No em analise.
* @throws Exception Se nao encontrar elemento.
*/
private void remover2(int x, No i, No pai) throws Exception {
if (i == null) {
throw new Exception("Erro ao remover2!");
} else if (x < i.elemento) {
remover2(x, i.esq, i);
} else if (x > i.elemento) {
remover2(x, i.dir, i);
} else if (i.dir == null) {
pai = i.esq;
} else if (i.esq == null) {
pai = i.dir;
} else {
i.esq = maiorEsq(i, i.esq);
}
}
private static boolean igual (No i1, No i2){ public int getRaiz() throws Exception {
boolean resp; return raiz.elemento;
if(i1 != null && i2 != null){ }
resp = (i1.elemento == i2.elemento) && igual(i1.esq, i2.esq) && igual(i1.dir, i2.dir);
} else if(i1 == null && i2 == null){
resp = true;
} else {
resp = false;
}
return resp;
}
public int soma(){ public static boolean igual (ArvoreBinaria a1, ArvoreBinaria a2){
return soma(raiz); return igual(a1.raiz, a2.raiz);
} }
public int soma(No i){ private static boolean igual (No i1, No i2){
int resp = 0; boolean resp;
if(i != null){ if(i1 != null && i2 != null){
resp = i.elemento; resp = (i1.elemento == i2.elemento) && igual(i1.esq, i2.esq) && igual(i1.dir, i2.dir);
resp += soma(i.esq); } else if(i1 == null && i2 == null){
resp += soma(i.dir); resp = true;
} } else {
return resp; resp = false;
} }
return resp;
}
public int quantidadePares(){ public int soma(){
return quantidadePares(raiz); return soma(raiz);
} }
public int quantidadePares(No i){ public int soma(No i){
int resp = 0; int resp = 0;
if(i != null){ if(i != null){
resp = ((i.elemento % 2 == 0) ? 1 : 0); resp = i.elemento + soma(i.esq) + soma(i.dir);
resp += quantidadePares(i.esq); }
resp += quantidadePares(i.dir); return resp;
} }
return resp;
}
public boolean hasDiv11(){ public int quantidadePares(){
return hasDiv11(raiz); return quantidadePares(raiz);
} }
public boolean hasDiv11(No i){ public int quantidadePares(No i){
boolean resp = false; int resp = 0;
if(i != null){ if(i != null){
resp = (i.elemento % 11 == 0) || hasDiv11(i.esq) || hasDiv11(i.dir); resp = ((i.elemento % 2 == 0) ? 1 : 0) + quantidadePares(i.esq) + quantidadePares(i.dir);
} }
return resp; return resp;
} }
public boolean hasDiv11(){
return hasDiv11(raiz);
}
public boolean hasDiv11(No i){
boolean resp = false;
if(i != null){
resp = (i.elemento % 11 == 0) || hasDiv11(i.esq) || hasDiv11(i.dir);
}
return resp;
}
} }