Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/icei-pucminas/aeds2
Browse files Browse the repository at this point in the history
  • Loading branch information
bigheadbh committed Nov 23, 2021
1 parent 9398a9a commit 79c88b3
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 197 deletions.
208 changes: 91 additions & 117 deletions fonte/u08 Balanceamento de árvores/java/avl/AVL.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
* Arvore binaria de pesquisa
* @author Max do Val Machado
*/
public class AVL {

public class AVL {
private No raiz; // Raiz da arvore.

/**
Expand All @@ -15,8 +16,8 @@ public AVL() {
/**
* 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.
* @return <code>true</code> se o elemento existir, <code>false</code> em caso
* contrario.
*/
public boolean pesquisar(int x) {
return pesquisar(x, raiz);
Expand All @@ -26,24 +27,21 @@ public boolean pesquisar(int x) {
* 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.
* @return <code>true</code> se o elemento existir, <code>false</code> em caso
* contrario.
*/
private boolean pesquisar(int x, No i) {
boolean resp;
boolean 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;
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;
}

/**
Expand Down Expand Up @@ -109,7 +107,6 @@ private void caminharPos(No i) {
}
}


/**
* Metodo publico iterativo para inserir elemento.
* @param x Elemento a ser inserido.
Expand All @@ -128,22 +125,17 @@ public void inserir(int x) throws Exception {
*/
private No inserir(int x, No i) throws Exception {
if (i == null) {
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!");
}

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 balancear(i);
}


/**
* Metodo publico iterativo para remover elemento.
* @param x Elemento a ser removido.
Expand All @@ -154,124 +146,106 @@ public void remover(int x) throws Exception {
}

/**
* Metodo privado recursivo para remover elemento.
* Metodo privado recursivo para remover elemento.
* @param x Elemento a ser removido.
* @param i No em analise.
* @return No em analise, alterado ou nao.
* @throws Exception Se nao encontrar elemento.
*/
private No remover(int x, No i) throws Exception {

if (i == null) {
throw new Exception("Erro ao remover!");

} else if (x < i.elemento) {
i.esq = remover(x, i.esq);

} else if (x > i.elemento) {
i.dir = remover(x, i.dir);

// Sem no a direita.
} else if (i.dir == null) {
i = i.esq;

// Sem no a esquerda.
} else if (i.esq == null) {
i = i.dir;

// No a esquerda e no a direita.
} else {
i.esq = maiorEsq(i, i.esq);
throw new Exception("Erro ao remover!");
} else if (x < i.elemento) {
i.esq = remover(x, i.esq);
} else if (x > i.elemento) {
i.dir = remover(x, i.dir);
// Sem no a direita.
} else if (i.dir == null) {
i = i.esq;
// Sem no a esquerda.
} else if (i.esq == null) {
i = i.dir;
// No a esquerda e no a direita.
} else {
i.esq = maiorEsq(i, i.esq);
}

return balancear(i);
}


/**
* Metodo para trocar o elemento "removido" pelo maior da esquerda.
* @param i No que teve o elemento removido.
* @param j No da subarvore esquerda.
* @return No em analise, alterado ou nao.
*/
private No maiorEsq(No i, No j) {

// Encontrou o maximo da subarvore esquerda.
// Encontrou o maximo da subarvore esquerda.
if (j.dir == null) {
i.elemento = j.elemento; // Substitui i por j.
j = j.esq; // Substitui j por j.ESQ.

// Existe no a direita.
// Existe no a direita.
} else {
// Caminha para direita.
// Caminha para direita.
j.dir = maiorEsq(i, j.dir);
}
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 {
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 rotacionarDir(No no) {
System.out.println("Rotacionar DIR(" + no.elemento + ")");
No noEsq = no.esq;
No noEsqDir = noEsq.dir;
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;
noEsq.dir = no;
no.esq = noEsqDir;

no.setNivel(); //Atualizar o nivel do no
noEsq.setNivel(); //Atualizar o nivel do noEsq
no.setNivel(); // Atualizar o nivel do no
noEsq.setNivel(); // Atualizar o nivel do noEsq

return noEsq;
}
return noEsq;
}

private No rotacionarEsq(No no) {
System.out.println("Rotacionar ESQ(" + no.elemento + ")");
No noDir = no.dir;
No noDirEsq = noDir.esq;
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;
noDir.esq = no;
no.dir = noDirEsq;

no.setNivel(); //Atualizar o nivel do no
noDir.setNivel(); //Atualizar o nivel do noDir
return noDir;
}
no.setNivel(); // Atualizar o nivel do no
noDir.setNivel(); // Atualizar o nivel do noDir
return noDir;
}
}
26 changes: 13 additions & 13 deletions fonte/u08 Balanceamento de árvores/java/avl/No.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
*/
class No {
public int elemento; // Conteudo do no.
public No esq, dir; // Filhos da esq e dir.
public int nivel; //Numero de niveis abaixo do no
public No esq, dir; // Filhos da esq e dir.
public int nivel; // Numero de niveis abaixo do no

/**
* Construtor da classe.
* Construtor da classe
* @param elemento Conteudo do no.
*/
public No(int elemento) {
Expand All @@ -18,28 +18,28 @@ public No(int elemento) {
/**
* Construtor da classe.
* @param elemento Conteudo do no.
* @param esq No da esquerda.
* @param dir No da direita.
* @param esq No da esquerda.
* @param dir No da direita.
*/
public No(int elemento, No esq, No dir, int nivel) {
this.elemento = elemento;
this.esq = esq;
this.dir = dir;
this.nivel = nivel;
this.nivel = nivel;
}

/**
* Cálculo do número de níveis a partir de um vértice
*/
public void setNivel() {
this.nivel = 1 + Math.max(getNivel(esq),getNivel(dir));
}
public void setNivel() {
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 nó que se deseja o nível.
*/
public static int getNivel(No no) {
return (no == null) ? 0 : no.nivel;
}
public static int getNivel(No no) {
return (no == null) ? 0 : no.nivel;
}
}
Loading

0 comments on commit 79c88b3

Please sign in to comment.