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

View File

@ -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.
}
}

View File

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

View File

@ -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();

View File

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

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.
} 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;
}