diff --git a/fonte/u08 Balanceamento de árvores/java/alvinegra/Alvinegra.java b/fonte/u08 Balanceamento de árvores/java/alvinegra/Alvinegra.java index 491512c..a41f465 100644 --- a/fonte/u08 Balanceamento de árvores/java/alvinegra/Alvinegra.java +++ b/fonte/u08 Balanceamento de árvores/java/alvinegra/Alvinegra.java @@ -1,256 +1,247 @@ /** * Arvore binaria de pesquisa + * * @author Max do Val Machado */ public class Alvinegra { - private NoAN raiz; // Raiz da arvore. + private NoAN raiz; // Raiz da arvore. - /** - * Construtor da classe. - */ - public Alvinegra() { - raiz = null; - } + /** + * Construtor da classe. + */ + public Alvinegra() { + raiz = null; + } - /** - * Metodo publico iterativo para pesquisar elemento. - * @param elemento Elemento que sera procurado. - * @return true se o elemento existir, - * false em caso contrario. - */ - public boolean pesquisar(int elemento) { - return pesquisar(elemento, raiz); - } + /** + * Metodo publico iterativo para pesquisar elemento. + * + * @param elemento Elemento que sera procurado. + * @return true se o elemento existir, + * false em caso contrario. + */ + public boolean pesquisar(int elemento) { + return pesquisar(elemento, raiz); + } - /** - * Metodo privado recursivo para pesquisar elemento. - * @param elemento Elemento que sera procurado. - * @param i NoAN em analise. - * @return true se o elemento existir, - * false em caso contrario. - */ - private boolean pesquisar(int elemento, NoAN i) { + /** + * Metodo privado recursivo para pesquisar elemento. + * + * @param elemento Elemento que sera procurado. + * @param i NoAN em analise. + * @return true se o elemento existir, + * false em caso contrario. + */ + private boolean pesquisar(int elemento, NoAN i) { boolean resp; - if (i == null) { + if (i == null) { resp = false; - } else if (elemento == i.elemento) { resp = true; - } else if (elemento < i.elemento) { resp = pesquisar(elemento, i.esq); - } else { resp = pesquisar(elemento, i.dir); } return resp; - } + } - /** - * Metodo publico iterativo para exibir elementos. - */ - public void caminharCentral() { - System.out.print("[ "); - caminharCentral(raiz); - System.out.println("]"); - } + /** + * Metodo publico iterativo para exibir elementos. + */ + public void caminharCentral() { + System.out.print("[ "); + caminharCentral(raiz); + System.out.println("]"); + } - /** - * Metodo privado recursivo para exibir elementos. - * @param i NoAN em analise. - */ - private void caminharCentral(NoAN i) { - if (i != null) { - caminharCentral(i.esq); // Elementos da esquerda. - System.out.print(i.elemento + ((i.cor) ? "(p) " : "(b) ")); // Conteudo do no. - caminharCentral(i.dir); // Elementos da direita. - } - } + /** + * Metodo privado recursivo para exibir elementos. + * + * @param i NoAN em analise. + */ + private void caminharCentral(NoAN i) { + if (i != null) { + caminharCentral(i.esq); // Elementos da esquerda. + System.out.print(i.elemento + ((i.cor) ? "(p) " : "(b) ")); // Conteudo do no. + caminharCentral(i.dir); // Elementos da direita. + } + } - /** - * Metodo publico iterativo para exibir elementos. - */ - public void caminharPre() { - System.out.print("[ "); - caminharPre(raiz); - System.out.println("]"); - } + /** + * Metodo publico iterativo para exibir elementos. + */ + public void caminharPre() { + System.out.print("[ "); + caminharPre(raiz); + System.out.println("]"); + } - /** - * Metodo privado recursivo para exibir elementos. - * @param i NoAN em analise. - */ - private void caminharPre(NoAN i) { - if (i != null) { - System.out.print(i.elemento + ((i.cor) ? "(p) " : "(b) ")); // Conteudo do no. - caminharPre(i.esq); // Elementos da esquerda. - caminharPre(i.dir); // Elementos da direita. - } - } + /** + * Metodo privado recursivo para exibir elementos. + * + * @param i NoAN em analise. + */ + private void caminharPre(NoAN i) { + if (i != null) { + System.out.print(i.elemento + ((i.cor) ? "(p) " : "(b) ")); // Conteudo do no. + caminharPre(i.esq); // Elementos da esquerda. + caminharPre(i.dir); // Elementos da direita. + } + } - /** - * Metodo publico iterativo para exibir elementos. - */ - public void caminharPos() { - System.out.print("[ "); - caminharPos(raiz); - System.out.println("]"); - } + /** + * Metodo publico iterativo para exibir elementos. + */ + public void caminharPos() { + System.out.print("[ "); + caminharPos(raiz); + System.out.println("]"); + } - /** - * Metodo privado recursivo para exibir elementos. - * @param i NoAN em analise. - */ - private void caminharPos(NoAN i) { - if (i != null) { - caminharPos(i.esq); // Elementos da esquerda. - caminharPos(i.dir); // Elementos da direita. - System.out.print(i.elemento + ((i.cor) ? "(p) " : "(b) ")); // Conteudo do no. - } - } + /** + * Metodo privado recursivo para exibir elementos. + * + * @param i NoAN em analise. + */ + private void caminharPos(NoAN i) { + if (i != null) { + caminharPos(i.esq); // Elementos da esquerda. + caminharPos(i.dir); // Elementos da direita. + System.out.print(i.elemento + ((i.cor) ? "(p) " : "(b) ")); // Conteudo do no. + } + } - - /** - * Metodo publico iterativo para inserir elemento. - * @param elemento Elemento a ser inserido. - * @throws Exception Se o elemento existir. - */ - public void inserir(int elemento) throws Exception { - - //Se a arvore estiver vazia - if(raiz == null){ + /** + * Metodo publico iterativo para inserir elemento. + * + * @param elemento Elemento a ser inserido. + * @throws Exception Se o elemento existir. + */ + public void inserir(int elemento) throws Exception { + // Se a arvore estiver vazia + if (raiz == null) { raiz = new NoAN(elemento); System.out.println("Antes, zero elementos. Agora, raiz(" + raiz.elemento + ")."); - //Senao, se a arvore tiver um elemento - } else if (raiz.esq == null && raiz.dir == null){ - if (elemento < raiz.elemento){ + // Senao, se a arvore tiver um elemento + } else if (raiz.esq == null && raiz.dir == null) { + if (elemento < raiz.elemento) { raiz.esq = new NoAN(elemento); - System.out.println("Antes, um elemento. Agora, raiz(" + raiz.elemento + ") e esq(" + raiz.esq.elemento +")."); + System.out.println("Antes, um elemento. Agora, raiz(" + raiz.elemento + ") e esq(" + raiz.esq.elemento + ")."); } else { raiz.dir = new NoAN(elemento); - System.out.println("Antes, um elemento. Agora, raiz(" + raiz.elemento + ") e dir(" + raiz.dir.elemento +")."); + System.out.println("Antes, um elemento. Agora, raiz(" + raiz.elemento + ") e dir(" + raiz.dir.elemento + ")."); } - //Senao, se a arvore tiver dois elementos (raiz e dir) - } else if (raiz.esq == null){ - - if(elemento < raiz.elemento){ + // Senao, se a arvore tiver dois elementos (raiz e dir) + } else if (raiz.esq == null) { + if (elemento < raiz.elemento) { raiz.esq = new NoAN(elemento); - System.out.println("Antes, dois elementos(A). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento +") e dir(" + raiz.dir.elemento +")."); + System.out.println("Antes, dois elementos(A). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento + ") e dir(" + raiz.dir.elemento + ")."); - } else if (elemento < raiz.dir.elemento){ + } else if (elemento < raiz.dir.elemento) { raiz.esq = new NoAN(raiz.elemento); raiz.elemento = elemento; - System.out.println("Antes, dois elementos(B). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento +") e dir(" + raiz.dir.elemento +")."); + System.out.println("Antes, dois elementos(B). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento + ") e dir(" + raiz.dir.elemento + ")."); } else { raiz.esq = new NoAN(raiz.elemento); raiz.elemento = raiz.dir.elemento; raiz.dir.elemento = elemento; - System.out.println("Antes, dois elementos(C). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento +") e dir(" + raiz.dir.elemento +")."); + System.out.println("Antes, dois elementos(C). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento + ") e dir(" + raiz.dir.elemento + ")."); } - raiz.esq.cor = raiz.dir.cor = false; - - //Senao, se a arvore tiver dois elementos (raiz e esq) - } else if (raiz.dir == null){ - - if(elemento > raiz.elemento){ + + // Senao, se a arvore tiver dois elementos (raiz e esq) + } else if (raiz.dir == null) { + if (elemento > raiz.elemento) { raiz.dir = new NoAN(elemento); - System.out.println("Antes, dois elementos(D). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento +") e dir(" + raiz.dir.elemento +")."); - } else if (elemento > raiz.esq.elemento){ + System.out.println("Antes, dois elementos(D). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento + ") e dir(" + raiz.dir.elemento + ")."); + + } else if (elemento > raiz.esq.elemento) { raiz.dir = new NoAN(raiz.elemento); raiz.elemento = elemento; - System.out.println("Antes, dois elementos(E). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento +") e dir(" + raiz.dir.elemento +")."); + System.out.println("Antes, dois elementos(E). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento + ") e dir(" + raiz.dir.elemento + ")."); + } else { raiz.dir = new NoAN(raiz.elemento); raiz.elemento = raiz.esq.elemento; raiz.esq.elemento = elemento; - System.out.println("Antes, dois elementos(F). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento +") e dir(" + raiz.dir.elemento +")."); + System.out.println("Antes, dois elementos(F). Agora, raiz(" + raiz.elemento + "), esq (" + raiz.esq.elemento + ") e dir(" + raiz.dir.elemento + ")."); } - raiz.esq.cor = raiz.dir.cor = false; - //Senao, a arvore tem tres ou mais elementos + // Senao, a arvore tem tres ou mais elementos } else { System.out.println("Arvore com tres ou mais elementos..."); - inserir(elemento, null, null, null, raiz); + inserir(elemento, null, null, null, raiz); } - raiz.cor = false; } - private void balancear(NoAN bisavo, NoAN avo, NoAN pai, NoAN i){ - - //Se o pai tambem e preto, reequilibrar a arvore, rotacionando o avo - if(pai.cor == true){ - - //4 tipos de reequilibrios e acoplamento - if(pai.elemento > avo.elemento){ // rotacao a esquerda ou direita-esquerda - if(i.elemento > pai.elemento){ + private void balancear(NoAN bisavo, NoAN avo, NoAN pai, NoAN i) { + // Se o pai tambem e preto, reequilibrar a arvore, rotacionando o avo + if (pai.cor == true) { + // 4 tipos de reequilibrios e acoplamento + if (pai.elemento > avo.elemento) { // rotacao a esquerda ou direita-esquerda + if (i.elemento > pai.elemento) { avo = rotacaoEsq(avo); } else { avo = rotacaoDirEsq(avo); } - } else { // rotacao a direita ou esquerda-direita - if(i.elemento < pai.elemento){ + if (i.elemento < pai.elemento) { avo = rotacaoDir(avo); } else { avo = rotacaoEsqDir(avo); } } - - if (bisavo == null){ + if (bisavo == null) { raiz = avo; - } else if(avo.elemento < bisavo.elemento){ + } else if (avo.elemento < bisavo.elemento) { bisavo.esq = avo; } else { bisavo.dir = avo; } - - //reestabelecer as cores apos a rotacao + // reestabelecer as cores apos a rotacao avo.cor = false; avo.esq.cor = avo.dir.cor = true; - System.out.println("Reestabeler cores: avo(" + avo.elemento + "->branco) e avo.esq / avo.dir(" + avo.esq.elemento + "," + avo.dir.elemento + "-> pretos)"); - } //if(pai.cor == true) + System.out.println("Reestabeler cores: avo(" + avo.elemento + "->branco) e avo.esq / avo.dir(" + + avo.esq.elemento + "," + avo.dir.elemento + "-> pretos)"); + } // if(pai.cor == true) } - /** - * Metodo privado recursivo para inserir elemento. - * @param elemento Elemento a ser inserido. - * @param avo NoAN em analise. - * @param pai NoAN em analise. - * @param i NoAN em analise. - * @throws Exception Se o elemento existir. - */ - private void inserir(int elemento, NoAN bisavo, NoAN avo, NoAN pai, NoAN i) throws Exception { - if (i == null) { - - if(elemento < pai.elemento){ + /** + * Metodo privado recursivo para inserir elemento. + * + * @param elemento Elemento a ser inserido. + * @param avo NoAN em analise. + * @param pai NoAN em analise. + * @param i NoAN em analise. + * @throws Exception Se o elemento existir. + */ + private void inserir(int elemento, NoAN bisavo, NoAN avo, NoAN pai, NoAN i) throws Exception { + if (i == null) { + if (elemento < pai.elemento) { i = pai.esq = new NoAN(elemento, true); } else { i = pai.dir = new NoAN(elemento, true); } - - if(pai.cor == true){ + if (pai.cor == true) { balancear(bisavo, avo, pai, i); } - } else { - - //Achou um 4-no: eh preciso fragmeta-lo e reequilibrar a arvore - if(i.esq != null && i.dir != null && i.esq.cor == true && i.dir.cor == true){ + // Achou um 4-no: eh preciso fragmeta-lo e reequilibrar a arvore + if (i.esq != null && i.dir != null && i.esq.cor == true && i.dir.cor == true) { i.cor = true; i.esq.cor = i.dir.cor = false; - if(i == raiz){ + if (i == raiz) { i.cor = false; - }else if(pai.cor == true){ + } else if (pai.cor == true) { balancear(bisavo, avo, pai, i); } } - if (elemento < i.elemento) { inserir(elemento, avo, pai, i, i.esq); } else if (elemento > i.elemento) { @@ -259,7 +250,7 @@ public class Alvinegra { throw new Exception("Erro inserir (elemento repetido)!"); } } - } + } private NoAN rotacaoDir(NoAN no) { System.out.println("Rotacao DIR(" + no.elemento + ")"); diff --git a/fonte/u08 Balanceamento de árvores/java/alvinegra/NoAN.java b/fonte/u08 Balanceamento de árvores/java/alvinegra/NoAN.java index 64eb836..95b0fa7 100644 --- a/fonte/u08 Balanceamento de árvores/java/alvinegra/NoAN.java +++ b/fonte/u08 Balanceamento de árvores/java/alvinegra/NoAN.java @@ -1,21 +1,26 @@ /** * NoAN da arvore binaria + * * @author Max do Val Machado */ -class NoAN{ +class NoAN { public boolean cor; public int elemento; public NoAN esq, dir; - public NoAN (){ - this(-1); + + public NoAN() { + this(-1); } - public NoAN (int elemento){ - this(elemento, false, null, null); + + public NoAN(int elemento) { + this(elemento, false, null, null); } - public NoAN (int elemento, boolean cor){ - this(elemento, cor, null, null); + + public NoAN(int elemento, boolean cor) { + this(elemento, cor, null, null); } - public NoAN (int elemento, boolean cor, NoAN esq, NoAN dir){ + + public NoAN(int elemento, boolean cor, NoAN esq, NoAN dir) { this.cor = cor; this.elemento = elemento; this.esq = esq; diff --git a/fonte/u08 Balanceamento de árvores/java/alvinegra/Principal.java b/fonte/u08 Balanceamento de árvores/java/alvinegra/Principal.java index fc3e2b7..99e2bf7 100644 --- a/fonte/u08 Balanceamento de árvores/java/alvinegra/Principal.java +++ b/fonte/u08 Balanceamento de árvores/java/alvinegra/Principal.java @@ -1,51 +1,48 @@ -import java.util.*; - /** * Principal para Arvore Binaria de Pesquisa + * * @author Max do Val Machado */ public class Principal { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Exception { Alvinegra arvore = new Alvinegra(); /* - arvore.inserir(1); - arvore.inserir(2); - arvore.inserir(3); - arvore.mostrarPre(); - - arvore = new Alvinegra(); - arvore.inserir(1); - arvore.inserir(3); - arvore.inserir(2); - arvore.mostrarPre(); - - arvore = new Alvinegra(); - arvore.inserir(2); - arvore.inserir(1); - arvore.inserir(3); - arvore.mostrarPre(); - - arvore = new Alvinegra(); - arvore.inserir(2); - arvore.inserir(3); - arvore.inserir(1); - arvore.mostrarPre(); - - arvore = new Alvinegra(); - arvore.inserir(3); - arvore.inserir(1); - arvore.inserir(2); - arvore.mostrarPre(); - - arvore = new Alvinegra(); - arvore.inserir(3); - arvore.inserir(2); - arvore.inserir(1); - arvore.mostrarPre(); - */ - - arvore = new Alvinegra(); + * arvore.inserir(1); + * arvore.inserir(2); + * arvore.inserir(3); + * arvore.mostrarPre(); + * + * arvore = new Alvinegra(); + * arvore.inserir(1); + * arvore.inserir(3); + * arvore.inserir(2); + * arvore.mostrarPre(); + * + * arvore = new Alvinegra(); + * arvore.inserir(2); + * arvore.inserir(1); + * arvore.inserir(3); + * arvore.mostrarPre(); + * + * arvore = new Alvinegra(); + * arvore.inserir(2); + * arvore.inserir(3); + * arvore.inserir(1); + * arvore.mostrarPre(); + * + * arvore = new Alvinegra(); + * arvore.inserir(3); + * arvore.inserir(1); + * arvore.inserir(2); + * arvore.mostrarPre(); + * + * arvore = new Alvinegra(); + * arvore.inserir(3); + * arvore.inserir(2); + * arvore.inserir(1); + * arvore.mostrarPre(); + */ arvore.inserir(4); arvore.inserir(35); arvore.inserir(10); @@ -57,21 +54,20 @@ public class Principal { arvore.inserir(7); arvore.inserir(40); arvore.inserir(20); - arvore.mostrarPre(); - + arvore.caminharPre(); /* - arvore = new Alvinegra(); - Random gerador = new Random(); - gerador.setSeed(4); - for(int i = 0; i < 4000; i++){ - int elemento; - do { - elemento = ((int)Math.abs(gerador.nextInt())) % 100000; - } while (arvore.pesquisar(elemento) == true); - arvore.inserir(elemento); - arvore.mostrarPre(); - } - */ - } + * arvore = new Alvinegra(); + * Random gerador = new Random(); + * gerador.setSeed(4); + * for(int i = 0; i < 4000; i++){ + * int elemento; + * do { + * elemento = ((int)Math.abs(gerador.nextInt())) % 100000; + * } while (arvore.pesquisar(elemento) == true); + * arvore.inserir(elemento); + * arvore.mostrarPre(); + * } + */ + } } diff --git a/fonte/u08 Balanceamento de árvores/java/avl/AVL.java b/fonte/u08 Balanceamento de árvores/java/avl/AVL.java index d60c293..f8236e0 100644 --- a/fonte/u08 Balanceamento de árvores/java/avl/AVL.java +++ b/fonte/u08 Balanceamento de árvores/java/avl/AVL.java @@ -3,7 +3,7 @@ * @author Max do Val Machado */ - public class AVL { +public class AVL { private No raiz; // Raiz da arvore. /** @@ -228,7 +228,6 @@ noEsq.dir = no; no.esq = noEsqDir; - no.setNivel(); // Atualizar o nivel do no noEsq.setNivel(); // Atualizar o nivel do noEsq diff --git a/fonte/u08 Balanceamento de árvores/java/avl/Principal.java b/fonte/u08 Balanceamento de árvores/java/avl/Principal.java index a178c84..12b7117 100644 --- a/fonte/u08 Balanceamento de árvores/java/avl/Principal.java +++ b/fonte/u08 Balanceamento de árvores/java/avl/Principal.java @@ -6,8 +6,8 @@ public class Principal { public static void main(String[] args) { try { AVL avl = new AVL(); - int array[] = {4,35,10,13,3,30,15,12,7,40,20}; - //int array[] = {1,2,3,4,5,6,7,8,9,10}; + //int array[] = {4,35,10,13,3,30,15,12,7,40,20}; + int array[] = {1,2,3,4,5,6,7,8,9,10}; for(int item: array){ System.out.println("Inserindo -> " + item); avl.inserir(item);