diff --git a/fonte/u07 Árvores binárias/arvoreBinaria/java/ArvoreBinaria.java b/fonte/u07 Árvores binárias/arvoreBinaria/java/ArvoreBinaria.java index f54248e..6c81e02 100644 --- a/fonte/u07 Árvores binárias/arvoreBinaria/java/ArvoreBinaria.java +++ b/fonte/u07 Árvores binárias/arvoreBinaria/java/ArvoreBinaria.java @@ -3,400 +3,408 @@ * @author Max do Val Machado */ public class ArvoreBinaria { - private No raiz; // Raiz da arvore. + private No raiz; // Raiz da arvore. - /** - * Construtor da classe. - */ - public ArvoreBinaria() { - raiz = null; - } + /** + * Construtor da classe. + */ + public ArvoreBinaria() { + raiz = null; + } - /** - * Metodo publico iterativo para pesquisar elemento. - * @param x Elemento que sera procurado. - * @return true se o elemento existir, - * false em caso contrario. - */ - public boolean pesquisar(int x) { - return pesquisar(x, raiz); - } + /** + * Metodo publico iterativo para pesquisar elemento. + * @param x Elemento que sera procurado. + * @return true se o elemento existir, + * false em caso contrario. + */ + public boolean pesquisar(int x) { + return pesquisar(x, raiz); + } - /** - * Metodo privado recursivo para pesquisar elemento. - * @param x Elemento que sera procurado. - * @param i No em analise. - * @return true se o elemento existir, - * false em caso contrario. - */ - private boolean pesquisar(int x, No i) { - boolean resp; - if (i == null) { - resp = false; - } else if (x == i.elemento) { - resp = true; - } else if (x < i.elemento) { - resp = pesquisar(x, i.esq); - } else { - resp = pesquisar(x, i.dir); - } - return resp; - } + /** + * Metodo privado recursivo para pesquisar elemento. + * @param x Elemento que sera procurado. + * @param i No em analise. + * @return true se o elemento existir, + * false em caso contrario. + */ + private boolean pesquisar(int x, No i) { + boolean resp; + if (i == null) { + resp = false; - /** - * Metodo publico iterativo para exibir elementos. - */ - public void caminharCentral() { - System.out.print("[ "); - caminharCentral(raiz); - System.out.println("]"); - } + } else if (x == i.elemento) { + resp = true; - /** - * Metodo privado recursivo para exibir elementos. - * @param i No em analise. - */ - private void caminharCentral(No i) { - if (i != null) { - caminharCentral(i.esq); // Elementos da esquerda. - System.out.print(i.elemento + " "); // Conteudo do no. - caminharCentral(i.dir); // Elementos da direita. - } - } + } else if (x < i.elemento) { + resp = pesquisar(x, i.esq); - /** - * Metodo publico iterativo para exibir elementos. - */ - public void caminharPre() { - System.out.print("[ "); - caminharPre(raiz); - System.out.println("]"); - } + } else { + resp = pesquisar(x, i.dir); + } + return resp; + } - /** - * Metodo privado recursivo para exibir elementos. - * @param i No em analise. - */ - private void caminharPre(No i) { - if (i != null) { - System.out.print(i.elemento + " "); // Conteudo do no. - caminharPre(i.esq); // Elementos da esquerda. - caminharPre(i.dir); // Elementos da direita. - } - } + /** + * 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 caminharPos() { - System.out.print("[ "); - caminharPos(raiz); - System.out.println("]"); - } + /** + * Metodo privado recursivo para exibir elementos. + * @param i No em analise. + */ + private void caminharCentral(No i) { + if (i != null) { + caminharCentral(i.esq); // Elementos da esquerda. + System.out.print(i.elemento + " "); // Conteudo do no. + caminharCentral(i.dir); // Elementos da direita. + } + } - /** - * Metodo privado recursivo para exibir elementos. - * @param i No em analise. - */ - private void caminharPos(No i) { - if (i != null) { - caminharPos(i.esq); // Elementos da esquerda. - caminharPos(i.dir); // Elementos da direita. - System.out.print(i.elemento + " "); // Conteudo do no. - } - } + /** + * 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 No em analise. + */ + private void caminharPre(No i) { + if (i != null) { + System.out.print(i.elemento + " "); // 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 privado recursivo para exibir elementos. + * @param i No em analise. + */ + private void caminharPos(No i) { + if (i != null) { + caminharPos(i.esq); // Elementos da esquerda. + caminharPos(i.dir); // Elementos da direita. + System.out.print(i.elemento + " "); // Conteudo do no. + } + } - /** - * Metodo publico iterativo para inserir elemento. - * @param x Elemento a ser inserido. - * @throws Exception Se o elemento existir. - */ - public void inserir(int x) throws Exception { - raiz = inserir(x, raiz); - } + /** + * Metodo publico iterativo para inserir elemento. + * @param x Elemento a ser inserido. + * @throws Exception Se o elemento existir. + */ + public void inserir(int x) throws Exception { + raiz = inserir(x, raiz); + } - /** - * Metodo privado recursivo para inserir elemento. - * @param x Elemento a ser inserido. - * @param i No em analise. - * @return No em analise, alterado ou nao. - * @throws Exception Se o elemento existir. - */ - private No inserir(int x, No i) throws Exception { - 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); - } else { - throw new Exception("Erro ao inserir!"); - } - return i; - } + /** + * Metodo privado recursivo para inserir elemento. + * @param x Elemento a ser inserido. + * @param i No em analise. + * @return No em analise, alterado ou nao. + * @throws Exception Se o elemento existir. + */ + private No inserir(int x, No i) throws Exception { + if (i == null) { + i = new No(x); - /** - * Metodo publico para inserir elemento. - * @param x Elemento a ser inserido. - * @throws Exception Se o elemento existir. - */ - public void inserirPai(int x) throws Exception { - if(raiz == null){ - raiz = new No(x); - } else if(x < raiz.elemento){ - inserirPai(x, raiz.esq, raiz); - } else if(x > raiz.elemento){ - inserirPai(x, raiz.dir, raiz); - } else { - throw new Exception("Erro ao inserirPai!"); - } - } + } else if (x < i.elemento) { + i.esq = inserir(x, i.esq); - /** - * Metodo privado recursivo para inserirPai elemento. - * @param x Elemento a ser inserido. - * @param i No em analise. - * @param pai No superior ao em analise. - * @throws Exception Se o elemento existir. - */ - private void inserirPai(int x, No i, No pai) throws Exception { - if (i == null) { - if(x < pai.elemento){ - pai.esq = new No(x); - } else { - pai.dir = new No(x); - } - } else if (x < i.elemento) { - inserirPai(x, i.esq, i); - } else if (x > i.elemento) { - inserirPai(x, i.dir, i); - } else { - throw new Exception("Erro ao inserirPai!"); - } - } + } else if (x > i.elemento) { + i.dir = inserir(x, i.dir); + + } else { + throw new Exception("Erro ao inserir!"); + } + + return i; + } + + /** + * Metodo publico para inserir elemento. + * @param x Elemento a ser inserido. + * @throws Exception Se o elemento existir. + */ + public void inserirPai(int x) throws Exception { + if(raiz == null){ + raiz = new No(x); + } else if(x < raiz.elemento){ + inserirPai(x, raiz.esq, raiz); + } else if(x > raiz.elemento){ + inserirPai(x, raiz.dir, raiz); + } else { + throw new Exception("Erro ao inserirPai!"); + } + } + + /** + * Metodo privado recursivo para inserirPai elemento. + * @param x Elemento a ser inserido. + * @param i No em analise. + * @param pai No superior ao em analise. + * @throws Exception Se o elemento existir. + */ + private void inserirPai(int x, No i, No pai) throws Exception { + if (i == null) { + if(x < pai.elemento){ + pai.esq = new No(x); + } else { + pai.dir = new No(x); + } + } else if (x < i.elemento) { + inserirPai(x, i.esq, i); + } else if (x > i.elemento) { + inserirPai(x, i.dir, i); + } else { + throw new Exception("Erro ao inserirPai!"); + } + } - /** - * Metodo publico iterativo para remover elemento. - * @param x Elemento a ser removido. - * @throws Exception Se nao encontrar elemento. - */ - public void remover(int x) throws Exception { - raiz = remover(x, raiz); - } + /** + * Metodo publico iterativo para remover elemento. + * @param x Elemento a ser removido. + * @throws Exception Se nao encontrar elemento. + */ + public void remover(int x) throws Exception { + raiz = remover(x, raiz); + } - /** - * Metodo privado recursivo para remover elemento. - * @param x Elemento a ser removido. - * @param i No em analise. - * @return No em analise, alterado ou nao. - * @throws Exception Se nao encontrar elemento. - */ - private No remover(int x, No i) throws Exception { + /** + * Metodo privado recursivo para remover elemento. + * @param x Elemento a ser removido. + * @param i No em analise. + * @return No em analise, alterado ou nao. + * @throws Exception Se nao encontrar elemento. + */ + private No remover(int x, No i) throws Exception { - if (i == null) { - throw new Exception("Erro ao remover!"); + if (i == null) { + throw new Exception("Erro ao remover!"); - } else if (x < i.elemento) { - i.esq = remover(x, i.esq); + } else if (x < i.elemento) { + i.esq = remover(x, i.esq); - } else if (x > i.elemento) { - i.dir = remover(x, i.dir); + } else if (x > i.elemento) { + i.dir = remover(x, i.dir); - // Sem no a direita. - } else if (i.dir == null) { - i = i.esq; + // Sem no a direita. + } else if (i.dir == null) { + i = i.esq; - // Sem no a esquerda. - } else if (i.esq == null) { - i = i.dir; + // Sem no a esquerda. + } else if (i.esq == null) { + i = i.dir; - // No a esquerda e no a direita. - } else { - i.esq = maiorEsq(i, i.esq); - } + // No a esquerda e no a direita. + } else { + i.esq = maiorEsq(i, i.esq); + } - return i; - } + return i; + } - /** - * 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 maiorEsq(No i, No j) { + /** + * 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 maiorEsq(No i, No j) { - // Encontrou o maximo da subarvore esquerda. - if (j.dir == null) { - i.elemento = j.elemento; // Substitui i por j. - j = j.esq; // Substitui j por j.ESQ. + // Encontrou o maximo da subarvore esquerda. + 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; - } + // 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 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 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 que retorna a altura da árvore + * @return int altura da árvore + */ + public int getAltura(){ + return getAltura(raiz, 0); + } - /** - * Metodo publico iterativo para remover elemento. - * @param x Elemento a ser removido. - * @throws Exception Se nao encontrar elemento. - */ - public void remover2(int x) throws Exception { - if (raiz == null) { - throw new Exception("Erro ao remover2!"); - } else if(x < raiz.elemento){ - remover2(x, raiz.esq, raiz); - } else if (x > raiz.elemento){ - remover2(x, raiz.dir, raiz); - } else if (raiz.dir == null) { - raiz = raiz.esq; - } else if (raiz.esq == null) { - raiz = raiz.dir; - } else { - raiz.esq = maiorEsq(raiz, raiz.esq); - } - } + /** + * 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 privado recursivo para remover elemento. - * @param x Elemento a ser removido. - * @param i No em analise. - * @param pai do No em analise. - * @throws Exception Se nao encontrar elemento. - */ - private void remover2(int x, No i, No pai) throws Exception { - if (i == null) { - throw new Exception("Erro ao remover2!"); - } else if (x < i.elemento) { - remover2(x, i.esq, i); - } else if (x > i.elemento) { - remover2(x, i.dir, i); - } else if (i.dir == null) { - pai = i.esq; - } else if (i.esq == null) { - pai = i.dir; - } else { - i.esq = maiorEsq(i, i.esq); - } - } - public int getRaiz() throws Exception { - return raiz.elemento; - } + /** + * Metodo publico iterativo para remover elemento. + * @param x Elemento a ser removido. + * @throws Exception Se nao encontrar elemento. + */ + public void remover2(int x) throws Exception { + if (raiz == null) { + throw new Exception("Erro ao remover2!"); + } else if(x < raiz.elemento){ + remover2(x, raiz.esq, raiz); + } else if (x > raiz.elemento){ + remover2(x, raiz.dir, raiz); + } else if (raiz.dir == null) { + raiz = raiz.esq; + } else if (raiz.esq == null) { + raiz = raiz.dir; + } else { + raiz.esq = maiorEsq(raiz, raiz.esq); + } + } - public static boolean igual (ArvoreBinaria a1, ArvoreBinaria a2){ - return igual(a1.raiz, a2.raiz); - } + /** + * Metodo privado recursivo para remover elemento. + * @param x Elemento a ser removido. + * @param i No em analise. + * @param pai do No em analise. + * @throws Exception Se nao encontrar elemento. + */ + private void remover2(int x, No i, No pai) throws Exception { + if (i == null) { + throw new Exception("Erro ao remover2!"); + } else if (x < i.elemento) { + remover2(x, i.esq, i); + } else if (x > i.elemento) { + remover2(x, i.dir, i); + } else if (i.dir == null) { + pai = i.esq; + } else if (i.esq == null) { + pai = i.dir; + } else { + i.esq = maiorEsq(i, i.esq); + } + } - private static boolean igual (No i1, No i2){ - boolean resp; - if(i1 != null && i2 != null){ - resp = (i1.elemento == i2.elemento) && igual(i1.esq, i2.esq) && igual(i1.dir, i2.dir); - } else if(i1 == null && i2 == null){ - resp = true; - } else { - resp = false; - } - return resp; - } + public int getRaiz() throws Exception { + return raiz.elemento; + } - public int soma(){ - return soma(raiz); - } + public static boolean igual (ArvoreBinaria a1, ArvoreBinaria a2){ + return igual(a1.raiz, a2.raiz); + } - public int soma(No i){ - int resp = 0; - if(i != null){ - resp = i.elemento; - resp += soma(i.esq); - resp += soma(i.dir); - } - return resp; - } + private static boolean igual (No i1, No i2){ + boolean resp; + if(i1 != null && i2 != null){ + resp = (i1.elemento == i2.elemento) && igual(i1.esq, i2.esq) && igual(i1.dir, i2.dir); + } else if(i1 == null && i2 == null){ + resp = true; + } else { + resp = false; + } + return resp; + } - public int quantidadePares(){ - return quantidadePares(raiz); - } + public int soma(){ + return soma(raiz); + } - public int quantidadePares(No i){ - int resp = 0; - if(i != null){ - resp = ((i.elemento % 2 == 0) ? 1 : 0); - resp += quantidadePares(i.esq); - resp += quantidadePares(i.dir); - } - return resp; - } + public int soma(No i){ + int resp = 0; + if(i != null){ + resp = i.elemento + soma(i.esq) + soma(i.dir); + } + return resp; + } - public boolean hasDiv11(){ - return hasDiv11(raiz); - } + public int quantidadePares(){ + return quantidadePares(raiz); + } - public boolean hasDiv11(No i){ - boolean resp = false; - if(i != null){ - resp = (i.elemento % 11 == 0) || hasDiv11(i.esq) || hasDiv11(i.dir); - } - return resp; - } + public int quantidadePares(No i){ + int resp = 0; + if(i != null){ + resp = ((i.elemento % 2 == 0) ? 1 : 0) + quantidadePares(i.esq) + quantidadePares(i.dir); + } + return resp; + } + + public boolean hasDiv11(){ + return hasDiv11(raiz); + } + + public boolean hasDiv11(No i){ + boolean resp = false; + if(i != null){ + resp = (i.elemento % 11 == 0) || hasDiv11(i.esq) || hasDiv11(i.dir); + } + return resp; + } }