diff --git a/aula/u07 Árvores binárias/unidade07a_arvores_arvoresBinarias.pdf b/aula/u07 Árvores binárias/unidade07-versão antiga.pdf similarity index 96% rename from aula/u07 Árvores binárias/unidade07a_arvores_arvoresBinarias.pdf rename to aula/u07 Árvores binárias/unidade07-versão antiga.pdf index 11cc8f5..f52d048 100644 Binary files a/aula/u07 Árvores binárias/unidade07a_arvores_arvoresBinarias.pdf and b/aula/u07 Árvores binárias/unidade07-versão antiga.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07a_árvoreBinaria_introdução.pdf b/aula/u07 Árvores binárias/unidade07a_árvoreBinaria_introdução.pdf new file mode 100644 index 0000000..e7b02e1 Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07a_árvoreBinaria_introdução.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07b_árvoreBinaria_inserção.pdf b/aula/u07 Árvores binárias/unidade07b_árvoreBinaria_inserção.pdf new file mode 100644 index 0000000..a3fe3d6 Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07b_árvoreBinaria_inserção.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07c_árvoreBinaria_pesquisa e caminhamento.pdf b/aula/u07 Árvores binárias/unidade07c_árvoreBinaria_pesquisa e caminhamento.pdf new file mode 100644 index 0000000..a5c9593 Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07c_árvoreBinaria_pesquisa e caminhamento.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07d_árvoreBinaria_remoção.pdf b/aula/u07 Árvores binárias/unidade07d_árvoreBinaria_remoção.pdf new file mode 100644 index 0000000..961cc78 Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07d_árvoreBinaria_remoção.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07e_árvoreBinaria_em_C.pdf b/aula/u07 Árvores binárias/unidade07e_árvoreBinaria_em_C.pdf new file mode 100644 index 0000000..a306704 Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07e_árvoreBinaria_em_C.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07f_árvoreBinaria_em_C++.pdf b/aula/u07 Árvores binárias/unidade07f_árvoreBinaria_em_C++.pdf new file mode 100644 index 0000000..744241d Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07f_árvoreBinaria_em_C++.pdf differ diff --git a/aula/u07 Árvores binárias/unidade07g_árvoreBinaria_Estruturas Híbridas.pdf b/aula/u07 Árvores binárias/unidade07g_árvoreBinaria_Estruturas Híbridas.pdf new file mode 100644 index 0000000..054bd33 Binary files /dev/null and b/aula/u07 Árvores binárias/unidade07g_árvoreBinaria_Estruturas Híbridas.pdf differ diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/exec b/fonte/u07 Árvores binárias/c/arvoreBinariaC/exec deleted file mode 100755 index 86b5765..0000000 Binary files a/fonte/u07 Árvores binárias/c/arvoreBinariaC/exec and /dev/null differ diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/arvorebinaria.c b/fonte/u07 Árvores binárias/c/arvorebinaria.c similarity index 85% rename from fonte/u07 Árvores binárias/c/arvoreBinariaC/arvorebinaria.c rename to fonte/u07 Árvores binárias/c/arvorebinaria.c index 01eaea1..cfb7d73 100644 --- a/fonte/u07 Árvores binárias/c/arvoreBinariaC/arvorebinaria.c +++ b/fonte/u07 Árvores binárias/c/arvorebinaria.c @@ -178,18 +178,18 @@ void removerRec(int x, No** i) { free(del); } else { - antecessor(i, &((*i)->esq)); + maiorEsq(i, &((*i)->esq)); } } /** - * Metodo para trocar no removido pelo antecessor. + * Metodo para trocar no removido pelo maiorEsq. * @param i No** endereco do ponteiro No que contem o elemento removido. * @param j No** endereco do ponteiro No da subarvore esquerda. */ -void antecessor(No** i, No** j) { +void maiorEsq(No** i, No** j) { if ((*j)->dir != NULL) { - antecessor(i, &((*j)->dir)); + maiorEsq(i, &((*j)->dir)); } else { No* del = *j; @@ -234,23 +234,25 @@ void removerRecSucessor(int x, No** i) { free(del); } else { - sucessor(i, &((*i)->dir)); + maiorEsq(i, &((*i)->dir)); } } /** - * Metodo para trocar no removido pelo sucessor. + * Metodo para trocar no removido pelo maior elemento da esquerda. * @param i No** endereco do ponteiro No que contem o elemento removido. * @param j No** endereco do ponteiro No da subarvore esquerda. */ -void sucessor(No** i, No** j) { - if ((*j)->esq != NULL) { - sucessor(i, &((*j)->esq)); - - } else { +void maiorEsq(No** i, No** j) { + // Encontrou o maximo da subarvore esquerda. + if ((*j)->dir == NULL) { No* del = *j; - (*i)->elemento = (*j)->elemento; - (*j) = (*j)->dir; + (*i)->elemento = (*j)->elemento; // Substitui i por j. + (*j) = (*j)->esq; // Substitui j por j.ESQ. free(del); + + // Existe no a direita. + } else { + maiorEsq(i, &((*j)->dir)); // Caminha para direita. } } diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/arvorebinaria.h b/fonte/u07 Árvores binárias/c/arvorebinaria.h similarity index 100% rename from fonte/u07 Árvores binárias/c/arvoreBinariaC/arvorebinaria.h rename to fonte/u07 Árvores binárias/c/arvorebinaria.h diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/makefile b/fonte/u07 Árvores binárias/c/makefile similarity index 100% rename from fonte/u07 Árvores binárias/c/arvoreBinariaC/makefile rename to fonte/u07 Árvores binárias/c/makefile diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/no.c b/fonte/u07 Árvores binárias/c/no.c similarity index 100% rename from fonte/u07 Árvores binárias/c/arvoreBinariaC/no.c rename to fonte/u07 Árvores binárias/c/no.c diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/no.h b/fonte/u07 Árvores binárias/c/no.h similarity index 100% rename from fonte/u07 Árvores binárias/c/arvoreBinariaC/no.h rename to fonte/u07 Árvores binárias/c/no.h diff --git a/fonte/u07 Árvores binárias/c/arvoreBinariaC/principal.c b/fonte/u07 Árvores binárias/c/principal.c similarity index 100% rename from fonte/u07 Árvores binárias/c/arvoreBinariaC/principal.c rename to fonte/u07 Árvores binárias/c/principal.c diff --git a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/arvorebinaria.cc b/fonte/u07 Árvores binárias/cc/arvorebinaria.cc similarity index 89% rename from fonte/u07 Árvores binárias/cc/arvoreBinariaCC/arvorebinaria.cc rename to fonte/u07 Árvores binárias/cc/arvorebinaria.cc index a1cfb4c..518de40 100644 --- a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/arvorebinaria.cc +++ b/fonte/u07 Árvores binárias/cc/arvorebinaria.cc @@ -175,26 +175,26 @@ void ArvoreBinaria::remover(int x, No* &i) { // No a esquerda e no a direita. } else { - antecessor(i, i->esq); + maiorEsq(i, i->esq); } } /** - * Metodo para trocar no removido pelo antecessor. + * 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::antecessor(No* i, No* &j) { - // Existe no a direita. - if (j->dir != NULL) { - antecessor(i, j->dir); // Caminha para direita. - - // Encontrou o maximo da subarvore esquerda. - } else { +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. } } diff --git a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/arvorebinaria.h b/fonte/u07 Árvores binárias/cc/arvorebinaria.h similarity index 100% rename from fonte/u07 Árvores binárias/cc/arvoreBinariaCC/arvorebinaria.h rename to fonte/u07 Árvores binárias/cc/arvorebinaria.h diff --git a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/makefile b/fonte/u07 Árvores binárias/cc/makefile similarity index 100% rename from fonte/u07 Árvores binárias/cc/arvoreBinariaCC/makefile rename to fonte/u07 Árvores binárias/cc/makefile diff --git a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/no.cc b/fonte/u07 Árvores binárias/cc/no.cc similarity index 100% rename from fonte/u07 Árvores binárias/cc/arvoreBinariaCC/no.cc rename to fonte/u07 Árvores binárias/cc/no.cc diff --git a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/no.h b/fonte/u07 Árvores binárias/cc/no.h similarity index 100% rename from fonte/u07 Árvores binárias/cc/arvoreBinariaCC/no.h rename to fonte/u07 Árvores binárias/cc/no.h diff --git a/fonte/u07 Árvores binárias/cc/arvoreBinariaCC/principal.cc b/fonte/u07 Árvores binárias/cc/principal.cc similarity index 100% rename from fonte/u07 Árvores binárias/cc/arvoreBinariaCC/principal.cc rename to fonte/u07 Árvores binárias/cc/principal.cc diff --git a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/ArvoreBinaria.java b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/ArvoreBinaria.java index 37c0ff3..01fff46 100644 --- a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/ArvoreBinaria.java +++ b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/ArvoreBinaria.java @@ -221,33 +221,92 @@ public class ArvoreBinaria { // No a esquerda e no a direita. } else { - i.esq = antecessor(i, i.esq); + i.esq = maiorEsq(i, i.esq); } return i; } /** - * Metodo para trocar no removido pelo antecessor. + * 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 antecessor(No i, No j) { - - // Existe no a direita. - if (j.dir != null) { - // Caminha para direita. - j.dir = antecessor(i, j.dir); + private No maiorEsq(No i, No j) { // Encontrou o maximo da subarvore esquerda. - } else { + if (j.dir == null) { i.elemento = j.elemento; // Substitui i por j. j = j.esq; // Substitui j por j.ESQ. + + // Existe no a direita. + } else { + // Caminha para direita. + j.dir = maiorEsq(i, j.dir); } return j; } + /** + * Metodo que retorna o maior elemento da árvore + * @return int maior elemento da árvore + */ + public int getMaior(){ + int resp = -1; + + if(raiz != null){ + No i; + for(i = raiz; i.dir != null; i = i.dir); + resp = i.elemento; + } + + return resp; + } + + + /** + * Metodo que retorna o menor elemento da árvore + * @return int menor elemento da árvore + */ + public int getMenor(){ + int resp = -1; + + if(raiz != null){ + No i; + for(i = raiz; i.esq != null; i = i.esq); + resp = i.elemento; + } + + return resp; + } + + + /** + * Metodo que retorna a altura da árvore + * @return int altura da árvore + */ + public int getAltura(){ + 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. * @param x Elemento a ser removido. @@ -265,7 +324,7 @@ public class ArvoreBinaria { } else if (raiz.esq == null) { raiz = raiz.dir; } else { - raiz.esq = antecessor(raiz, raiz.esq); + raiz.esq = maiorEsq(raiz, raiz.esq); } } @@ -288,7 +347,7 @@ public class ArvoreBinaria { } else if (i.esq == null) { pai = i.dir; } else { - i.esq = antecessor(i, i.esq); + i.esq = maiorEsq(i, i.esq); } } @@ -347,37 +406,4 @@ public class ArvoreBinaria { } return resp; } - - void exerResol2(){ - inserir(2); - //.. - inserir(7); - - caminharPre(); - raiz = rotacionarEsq(raiz); - caminharPre(); - } - - void exer3(){ - int a, b, c; - a = lerInt(); - b = lerInt(); - c = lerInt(); - - inserir(a); - inserir(b); - inserir(c); - - - - } - - - - - - - - - } diff --git a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal.java b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal.java index b27b425..cf4ed9b 100644 --- a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal.java +++ b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal.java @@ -15,6 +15,10 @@ public class Principal { arvoreBinaria.inserir(7); arvoreBinaria.inserir(6); + System.out.println("Altura: " + arvoreBinaria.getAltura()); + System.out.println("Menor valor: " + arvoreBinaria.getMenor()); + System.out.println("Maior valor: " + arvoreBinaria.getMaior()); + arvoreBinaria.caminharCentral(); arvoreBinaria.caminharPre(); arvoreBinaria.caminharPos(); diff --git a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal2.java b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal2.java index bbfefb0..428f4c5 100644 --- a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal2.java +++ b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal2.java @@ -6,28 +6,23 @@ import java.util.*; public class Principal2 { public static void main(String[] args) throws Exception { - ArvoreBinaria a1 = new ArvoreBinaria(); - ArvoreBinaria a2 = new ArvoreBinaria(); + ArvoreBinaria a = new ArvoreBinaria(); Random gerador = new Random(); - gerador.setSeed(4); + gerador.setSeed(0); for(int i = 1; i <= 100000; i++){ - int valor = Math.abs(gerador.nextInt()); - if(a1.pesquisar(valor) == false){ - a1.inserir(valor); - a2.inserir(valor); - } - if(i % 100 == 0){ - a1.remover(valor); - a2.remover(valor); - a1.remover(a1.getRaiz()); - a2.remover(a2.getRaiz()); - } + int valor; + do { + valor = Math.abs(gerador.nextInt()); + } while (a.pesquisar(valor) == true); - if(ArvoreBinaria.igual(a1, a2) == false){ - System.out.println("Árvores diferentes..."); - } + a.inserir(valor); + if(i % 1000 == 0){ + double log2 = (Math.log(i) / Math.log(2)); + log2 *= 1.39; + System.out.println("Número de nós = " + i + " --- log(i,2) = " + log2 + " --- h = " + a.getAltura()); + } } } } diff --git a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal3.java b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal3.java new file mode 100644 index 0000000..b42bfba --- /dev/null +++ b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/Principal3.java @@ -0,0 +1,33 @@ +/** + * Principal para Arvore Binaria de Pesquisa + * @author Max do Val Machado + */ +import java.util.*; + +public class Principal3 { + public static void main(String[] args) throws Exception { + ArvoreBinaria a1 = new ArvoreBinaria(); + ArvoreBinaria a2 = new ArvoreBinaria(); + + Random gerador = new Random(); + gerador.setSeed(4); + for(int i = 1; i <= 100000; i++){ + int valor = Math.abs(gerador.nextInt()); + if(a1.pesquisar(valor) == false){ + a1.inserir(valor); + a2.inserir(valor); + } + if(i % 100 == 0){ + a1.remover(valor); + a2.remover(valor); + a1.remover(a1.getRaiz()); + a2.remover(a2.getRaiz()); + } + + if(ArvoreBinaria.igual(a1, a2) == false){ + System.out.println("Árvores diferentes..."); + } + + } + } +} diff --git a/fonte/u07 Árvores binárias/java/arvoreBinariaJava/TreeSort.java b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/TreeSort.java new file mode 100644 index 0000000..de5ec81 --- /dev/null +++ b/fonte/u07 Árvores binárias/java/arvoreBinariaJava/TreeSort.java @@ -0,0 +1,61 @@ +import java.util.*; +public class TreeSort { + private No raiz; + private int n; + + public TreeSort() { + raiz = null; + n = 0; + } + + public int[] sort() { + int[] array = new int[n]; + n = 0; + sort(raiz, array); + return array; + } + + private void sort(No i, int[] array) { + if (i != null) { + sort(i.esq, array); + array[n++] = i.elemento; + sort (i.dir, array); + } + } + + public void inserir(int x) { + n++; + raiz = inserir(x, raiz); + } + + private No inserir(int x, No i) { + 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); + } + + return i; + } + + public static void main(String[] args){ + TreeSort a = new TreeSort(); + Random gerador = new Random(); + gerador.setSeed(0); + System.out.print("\nArray: "); + for(int i = 1; i <= 100; i++){ + int valor = Math.abs(gerador.nextInt() % 1000); + a.inserir(valor); + System.out.print(valor + " "); + } + System.out.print("\nArray ordenado: "); + int[] array = a.sort(); + for(int i = 0; i < array.length; i++){ + System.out.print(array[i] + " "); + } + } +} diff --git a/fonte/u08 Balanceamento de árvores/java/avl/AVL.java b/fonte/u08 Balanceamento de árvores/java/avl/AVL.java index 6c88c15..64b33e4 100644 --- a/fonte/u08 Balanceamento de árvores/java/avl/AVL.java +++ b/fonte/u08 Balanceamento de árvores/java/avl/AVL.java @@ -181,29 +181,30 @@ public class AVL { // No a esquerda e no a direita. } else { - i.esq = antecessor(i, i.esq); + i.esq = maiorEsq(i, i.esq); } return balancear(i); } + /** - * Metodo para trocar no removido pelo antecessor. + * 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 antecessor(No i, No j) { - - // Existe no a direita. - if (j.dir != null) { - // Caminha para direita. - j.dir = antecessor(i, j.dir); + private No maiorEsq(No i, No j) { // Encontrou o maximo da subarvore esquerda. - } else { + if (j.dir == null) { i.elemento = j.elemento; // Substitui i por j. j = j.esq; // Substitui j por j.ESQ. + + // Existe no a direita. + } else { + // Caminha para direita. + j.dir = maiorEsq(i, j.dir); } return j; }