This commit is contained in:
Max do Val Machado 2021-05-05 23:11:25 -03:00
parent ae8a2ae91b
commit 4281f06b0a
27 changed files with 214 additions and 92 deletions

View File

@ -178,18 +178,18 @@ void removerRec(int x, No** i) {
free(del); free(del);
} else { } 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 i No** endereco do ponteiro No que contem o elemento removido.
* @param j No** endereco do ponteiro No da subarvore esquerda. * @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) { if ((*j)->dir != NULL) {
antecessor(i, &((*j)->dir)); maiorEsq(i, &((*j)->dir));
} else { } else {
No* del = *j; No* del = *j;
@ -234,23 +234,25 @@ void removerRecSucessor(int x, No** i) {
free(del); free(del);
} else { } 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 i No** endereco do ponteiro No que contem o elemento removido.
* @param j No** endereco do ponteiro No da subarvore esquerda. * @param j No** endereco do ponteiro No da subarvore esquerda.
*/ */
void sucessor(No** i, No** j) { void maiorEsq(No** i, No** j) {
if ((*j)->esq != NULL) { // Encontrou o maximo da subarvore esquerda.
sucessor(i, &((*j)->esq)); if ((*j)->dir == NULL) {
} else {
No* del = *j; No* del = *j;
(*i)->elemento = (*j)->elemento; (*i)->elemento = (*j)->elemento; // Substitui i por j.
(*j) = (*j)->dir; (*j) = (*j)->esq; // Substitui j por j.ESQ.
free(del); free(del);
// Existe no a direita.
} else {
maiorEsq(i, &((*j)->dir)); // Caminha para direita.
} }
} }

View File

@ -175,26 +175,26 @@ void ArvoreBinaria::remover(int x, No* &i) {
// No a esquerda e no a direita. // No a esquerda e no a direita.
} else { } 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 i No que teve o elemento removido.
* @param j No da subarvore esquerda. * @param j No da subarvore esquerda.
*/ */
void ArvoreBinaria::antecessor(No* i, No* &j) { void ArvoreBinaria::maiorEsq(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. // Encontrou o maximo da subarvore esquerda.
} else { if (j->dir == NULL) {
No* del = j; No* del = j;
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.
delete del; delete del;
// Existe no a direita.
} else {
maiorEsq(i, j->dir); // Caminha para direita.
} }
} }

View File

@ -221,33 +221,92 @@ public class ArvoreBinaria {
// No a esquerda e no a direita. // No a esquerda e no a direita.
} else { } else {
i.esq = antecessor(i, i.esq); i.esq = maiorEsq(i, i.esq);
} }
return i; 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 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 antecessor(No i, No j) { private No maiorEsq(No i, No j) {
// Existe no a direita.
if (j.dir != null) {
// Caminha para direita.
j.dir = antecessor(i, j.dir);
// Encontrou o maximo da subarvore esquerda. // Encontrou o maximo da subarvore esquerda.
} else { 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.
} else {
// Caminha para direita.
j.dir = maiorEsq(i, j.dir);
} }
return j; 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. * Metodo publico iterativo para remover elemento.
* @param x Elemento a ser removido. * @param x Elemento a ser removido.
@ -265,7 +324,7 @@ public class ArvoreBinaria {
} else if (raiz.esq == null) { } else if (raiz.esq == null) {
raiz = raiz.dir; raiz = raiz.dir;
} else { } 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) { } else if (i.esq == null) {
pai = i.dir; pai = i.dir;
} else { } else {
i.esq = antecessor(i, i.esq); i.esq = maiorEsq(i, i.esq);
} }
} }
@ -347,37 +406,4 @@ public class ArvoreBinaria {
} }
return resp; 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);
}
} }

View File

@ -15,6 +15,10 @@ public class Principal {
arvoreBinaria.inserir(7); arvoreBinaria.inserir(7);
arvoreBinaria.inserir(6); 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.caminharCentral();
arvoreBinaria.caminharPre(); arvoreBinaria.caminharPre();
arvoreBinaria.caminharPos(); arvoreBinaria.caminharPos();

View File

@ -6,28 +6,23 @@ import java.util.*;
public class Principal2 { public class Principal2 {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
ArvoreBinaria a1 = new ArvoreBinaria(); ArvoreBinaria a = new ArvoreBinaria();
ArvoreBinaria a2 = new ArvoreBinaria();
Random gerador = new Random(); Random gerador = new Random();
gerador.setSeed(4); gerador.setSeed(0);
for(int i = 1; i <= 100000; i++){ for(int i = 1; i <= 100000; i++){
int valor = Math.abs(gerador.nextInt()); int valor;
if(a1.pesquisar(valor) == false){ do {
a1.inserir(valor); valor = Math.abs(gerador.nextInt());
a2.inserir(valor); } while (a.pesquisar(valor) == true);
}
if(i % 100 == 0){
a1.remover(valor);
a2.remover(valor);
a1.remover(a1.getRaiz());
a2.remover(a2.getRaiz());
}
if(ArvoreBinaria.igual(a1, a2) == false){ a.inserir(valor);
System.out.println("Árvores diferentes...");
}
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());
}
} }
} }
} }

View File

@ -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...");
}
}
}
}

View File

@ -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] + " ");
}
}
}

View File

@ -181,29 +181,30 @@ public class AVL {
// No a esquerda e no a direita. // No a esquerda e no a direita.
} else { } else {
i.esq = antecessor(i, i.esq); i.esq = maiorEsq(i, i.esq);
} }
return balancear(i); 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 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 antecessor(No i, No j) { private No maiorEsq(No i, No j) {
// Existe no a direita.
if (j.dir != null) {
// Caminha para direita.
j.dir = antecessor(i, j.dir);
// Encontrou o maximo da subarvore esquerda. // Encontrou o maximo da subarvore esquerda.
} else { 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.
} else {
// Caminha para direita.
j.dir = maiorEsq(i, j.dir);
} }
return j; return j;
} }