This commit is contained in:
Felipe Domingos 2021-11-23 08:13:52 -03:00
parent 9398a9aede
commit 79c88b3c4a
4 changed files with 112 additions and 197 deletions

View File

@ -2,7 +2,8 @@
* Arvore binaria de pesquisa * Arvore binaria de pesquisa
* @author Max do Val Machado * @author Max do Val Machado
*/ */
public class AVL {
public class AVL {
private No raiz; // Raiz da arvore. private No raiz; // Raiz da arvore.
/** /**
@ -15,8 +16,8 @@ public class AVL {
/** /**
* 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
* <code>false</code> em caso contrario. * contrario.
*/ */
public boolean pesquisar(int x) { public boolean pesquisar(int x) {
return pesquisar(x, raiz); return pesquisar(x, raiz);
@ -26,24 +27,21 @@ public class AVL {
* 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
* <code>false</code> em caso contrario. * 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) {
} else if (x == i.elemento) { resp = true;
resp = true; } else if (x < i.elemento) {
resp = pesquisar(x, i.esq);
} else if (x < i.elemento) { } else {
resp = pesquisar(x, i.esq); resp = pesquisar(x, i.dir);
}
} else { return resp;
resp = pesquisar(x, i.dir);
}
return resp;
} }
/** /**
@ -109,7 +107,6 @@ public class AVL {
} }
} }
/** /**
* Metodo publico iterativo para inserir elemento. * Metodo publico iterativo para inserir elemento.
* @param x Elemento a ser inserido. * @param x Elemento a ser inserido.
@ -128,22 +125,17 @@ public class AVL {
*/ */
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) {
} else if (x < i.elemento) { i.esq = inserir(x, i.esq);
i.esq = inserir(x, i.esq); } else if (x > i.elemento) {
i.dir = inserir(x, i.dir);
} else if (x > i.elemento) { } else {
i.dir = inserir(x, i.dir); throw new Exception("Erro ao inserir!");
}
} else {
throw new Exception("Erro ao inserir!");
}
return balancear(i); return balancear(i);
} }
/** /**
* Metodo publico iterativo para remover elemento. * Metodo publico iterativo para remover elemento.
* @param x Elemento a ser removido. * @param x Elemento a ser removido.
@ -154,40 +146,33 @@ public class AVL {
} }
/** /**
* 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) {
i.dir = remover(x, i.dir);
} else if (x > i.elemento) { // Sem no a direita.
i.dir = remover(x, i.dir); } else if (i.dir == null) {
i = i.esq;
// Sem no a direita. // Sem no a esquerda.
} else if (i.dir == null) { } else if (i.esq == null) {
i = i.esq; i = i.dir;
// No a esquerda e no a direita.
// Sem no a esquerda. } else {
} else if (i.esq == null) { i.esq = maiorEsq(i, i.esq);
i = i.dir;
// No a esquerda e no a direita.
} else {
i.esq = maiorEsq(i, i.esq);
} }
return balancear(i); return balancear(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.
@ -195,83 +180,72 @@ public class AVL {
* @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;
} }
private No balancear(No no) throws Exception {
if (no != null) {
int fator = No.getNivel(no.dir) - No.getNivel(no.esq);
// Se balanceada
if (Math.abs(fator) <= 1) {
no.setNivel();
// Se desbalanceada para a direita
} else if (fator == 2) {
int fatorFilhoDir = No.getNivel(no.dir.dir) - No.getNivel(no.dir.esq);
// Se o filho a direita tambem estiver desbalanceado
if (fatorFilhoDir == -1) {
no.dir = rotacionarDir(no.dir);
}
no = rotacionarEsq(no);
// Se desbalanceada para a esquerda
} else if (fator == -2) {
int fatorFilhoEsq = No.getNivel(no.esq.dir) - No.getNivel(no.esq.esq);
// Se o filho a esquerda tambem estiver desbalanceado
if (fatorFilhoEsq == 1) {
no.esq = rotacionarEsq(no.esq);
}
no = rotacionarDir(no);
} else {
throw new Exception(
"Erro no No(" + no.elemento + ") com fator de balanceamento (" + fator + ") invalido!");
}
}
return no;
}
private No balancear(No no) throws Exception { private No rotacionarDir(No no) {
if(no != null){ //System.out.println("Rotacionar DIR(" + no.elemento + ")");
int fator = No.getNivel(no.dir) - no.getNivel(no.esq); No noEsq = no.esq;
No noEsqDir = noEsq.dir;
//Se balanceada noEsq.dir = no;
if (Math.abs(fator) <= 1){ no.esq = noEsqDir;
no.setNivel();
//Se desbalanceada para a direita no.setNivel(); // Atualizar o nivel do no
}else if (fator == 2){ noEsq.setNivel(); // Atualizar o nivel do noEsq
int fatorFilhoDir = No.getNivel(no.dir.dir) - No.getNivel(no.dir.esq); return noEsq;
}
//Se o filho a direita tambem estiver desbalanceado private No rotacionarEsq(No no) {
if (fatorFilhoDir == -1) { //System.out.println("Rotacionar ESQ(" + no.elemento + ")");
no.dir = rotacionarDir(no.dir); No noDir = no.dir;
} No noDirEsq = noDir.esq;
no = rotacionarEsq(no);
//Se desbalanceada para a esquerda noDir.esq = no;
}else if (fator == -2){ no.dir = noDirEsq;
int fatorFilhoEsq = No.getNivel(no.esq.dir) - No.getNivel(no.esq.esq); no.setNivel(); // Atualizar o nivel do no
noDir.setNivel(); // Atualizar o nivel do noDir
//Se o filho a esquerda tambem estiver desbalanceado return noDir;
if (fatorFilhoEsq == 1) { }
no.esq = rotacionarEsq(no.esq);
}
no = rotacionarDir(no);
}else{
throw new Exception("Erro no No(" + no.elemento + ") com fator de balanceamento (" + fator + ") invalido!");
}
}
return no;
}
private No rotacionarDir(No no) {
System.out.println("Rotacionar DIR(" + no.elemento + ")");
No noEsq = no.esq;
No noEsqDir = noEsq.dir;
noEsq.dir = no;
no.esq = noEsqDir;
no.setNivel(); //Atualizar o nivel do no
noEsq.setNivel(); //Atualizar o nivel do noEsq
return noEsq;
}
private No rotacionarEsq(No no) {
System.out.println("Rotacionar ESQ(" + no.elemento + ")");
No noDir = no.dir;
No noDirEsq = noDir.esq;
noDir.esq = no;
no.dir = noDirEsq;
no.setNivel(); //Atualizar o nivel do no
noDir.setNivel(); //Atualizar o nivel do noDir
return noDir;
}
} }

View File

@ -4,11 +4,11 @@
*/ */
class No { class No {
public int elemento; // Conteudo do no. public int elemento; // Conteudo do no.
public No esq, dir; // Filhos da esq e dir. public No esq, dir; // Filhos da esq e dir.
public int nivel; //Numero de niveis abaixo do no public int nivel; // Numero de niveis abaixo do no
/** /**
* Construtor da classe. * Construtor da classe
* @param elemento Conteudo do no. * @param elemento Conteudo do no.
*/ */
public No(int elemento) { public No(int elemento) {
@ -18,28 +18,28 @@ class No {
/** /**
* Construtor da classe. * Construtor da classe.
* @param elemento Conteudo do no. * @param elemento Conteudo do no.
* @param esq No da esquerda. * @param esq No da esquerda.
* @param dir No da direita. * @param dir No da direita.
*/ */
public No(int elemento, No esq, No dir, int nivel) { public No(int elemento, No esq, No dir, int nivel) {
this.elemento = elemento; this.elemento = elemento;
this.esq = esq; this.esq = esq;
this.dir = dir; this.dir = dir;
this.nivel = nivel; this.nivel = nivel;
} }
/** /**
* Cálculo do número de níveis a partir de um vértice * Cálculo do número de níveis a partir de um vértice
*/ */
public void setNivel() { public void setNivel() {
this.nivel = 1 + Math.max(getNivel(esq),getNivel(dir)); this.nivel = 1 + Math.max(getNivel(esq), getNivel(dir));
} }
/** /**
* Retorna o número de níveis a partir de um vértice * Retorna o número de níveis a partir de um vértice
* @param no que se deseja o nível. * @param no que se deseja o nível.
*/ */
public static int getNivel(No no) { public static int getNivel(No no) {
return (no == null) ? 0 : no.nivel; return (no == null) ? 0 : no.nivel;
} }
} }

View File

@ -6,70 +6,12 @@ public class Principal {
public static void main(String[] args) { public static void main(String[] args) {
try { try {
AVL avl = new AVL(); AVL avl = new AVL();
avl.inserir(9); int array[] = {1,2,3,4,5,6,7,8,9,10};
for(int item: array){
avl.inserir(item);
}
avl.caminharPre(); avl.caminharPre();
avl.inserir(8); } catch (Exception erro) {
avl.caminharPre();
avl.inserir(4);
avl.caminharPre();
avl.inserir(6);
avl.caminharPre();
avl.inserir(5);
avl.caminharPre();
avl.inserir(3);
avl.caminharPre();
avl.inserir(7);
avl.caminharPre();
avl.inserir(2);
avl.caminharPre();
avl.inserir(1);
avl.caminharPre();
/*
avl.inserir(8);
avl.caminharPre();
avl.inserir(10);
avl.caminharPre();
avl.inserir(5);
avl.caminharPre();
avl.inserir(6);
avl.caminharPre();
avl.inserir(2);
avl.caminharPre();
avl.inserir(9);
avl.caminharPre();
avl.inserir(11);
avl.caminharPre();
avl.inserir(1);
avl.caminharPre();
avl.inserir(4);
avl.caminharPre();
avl.inserir(7);
avl.caminharPre();
avl.inserir(12);
avl.caminharPre();
avl.inserir(3);
avl.caminharPre();
for(int i = 40; i >= 21; i--){
avl.inserir(i);
avl.caminharPre();
System.out.println("Inserindo o " + i + " (altura = " + avl.getAltura() +")");
}
avl.caminharCentral();
avl.caminharPre();
avl.caminharPos();
avl.remover(6);
avl.remover(2);
avl.remover(4);
avl.caminharCentral();
avl.caminharPre();
avl.caminharPos();
*/
}
catch(Exception erro) {
System.out.println(erro.getMessage()); System.out.println(erro.getMessage());
} }
} }

View File

@ -8,7 +8,7 @@
import java.io.*; import java.io.*;
import java.io.FileReader; import java.io.FileReader;
class Serie{ class Serie {
//declaração dos atributos //declaração dos atributos
private String name; private String name;
private String format; private String format;
@ -189,7 +189,7 @@ class Serie{
BufferedReader br = new BufferedReader(fileReader); //declaração do bufferedReader para leitura do arquivo BufferedReader br = new BufferedReader(fileReader); //declaração do bufferedReader para leitura do arquivo
//set nome da série //set nome da série
this.name = searchName(fileName); this.name = searchName(fileName).trim();
//set Formato da série //set Formato da série
while(!br.readLine().contains("Formato")); while(!br.readLine().contains("Formato"));
@ -223,8 +223,6 @@ class Serie{
while(!br.readLine().contains("N.º de episódios")); while(!br.readLine().contains("N.º de episódios"));
this.episodes = justInt(removeTags(br.readLine())); this.episodes = justInt(removeTags(br.readLine()));
//método para mostrar a classe
this.printClass();
//fechamento do bufferedReader //fechamento do bufferedReader
br.close(); br.close();
//Tratamento de exceções //Tratamento de exceções
@ -234,4 +232,5 @@ class Serie{
System.out.println("Error reading file '" + fileName + "'"); System.out.println("Error reading file '" + fileName + "'");
} }
} }
} }