update
This commit is contained in:
parent
ae8a2ae91b
commit
4281f06b0a
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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.
|
// Encontrou o maximo da subarvore esquerda.
|
||||||
if (j->dir != NULL) {
|
if (j->dir == NULL) {
|
||||||
antecessor(i, j->dir); // Caminha para direita.
|
|
||||||
|
|
||||||
// Encontrou o maximo da subarvore esquerda.
|
|
||||||
} else {
|
|
||||||
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.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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...");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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] + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue