@NetoChaves escreveu:
Olá galera tudo bem? estou implementando uma arvore AVL para um trabalho da faculdade mas estou tendo problemas no método remover alguns elementos ele exclui outros exclui mais de um e outro exclui a arvore toda
segue abaixo meu código obrigado desde jápackage controller; public class AvlArvore { public AvlNo raiz = null; public AvlArvore() { raiz = null; } public void clear() { raiz = null; } public boolean isEmpty() { return raiz == null; } public AvlNo getraizNo() { return raiz; } /** Retorna a altura da árvore */ private static int altura(AvlNo t) { return t == null ? -1 : t.altura; } /** * Retorna o maior valor ente es e di. */ private static int max(int es, int di) { return es > di ? es : di; } /** Retorna o fator de balanceamento da árvore com raiz t */ public int getFator(AvlNo t) { return altura(t.esq) - altura(t.dir); } public boolean inserir(int x) { raiz = inserir(x, raiz); return true; } private AvlNo inserir(int x, AvlNo t) { if (t == null) t = new AvlNo(x, null, null,null); else if (x < t.key){ t.esq = inserir(x, t.esq); t.setPai(raiz); } else if (x > t.key){ t.dir = inserir(x, t.dir); t.setPai(raiz); } t = balancear(t); return t; } public AvlNo balancear(AvlNo t) { if (getFator(t) == 2) { if (getFator(t.esq) > 0) t = RotacaoDir(t); else t = RotacaoDuplaDir(t); } else if (getFator(t) == -2) { if (getFator(t.dir) < 0) t = RotacaoEsq(t); else t = RotacaoDuplaEsq(t); } t.altura = max(altura(t.esq), altura(t.dir)) + 1; return t; } /** Faz Rotação simples a direita */ private static AvlNo RotacaoDir(AvlNo x2) { AvlNo x1 = x2.esq; x2.esq = x1.dir; x1.dir = x2; x2.altura = max(altura(x2.esq), altura(x2.dir)) + 1; x1.altura = max(altura(x1.esq), x2.altura) + 1; return x1; } /** Rotação simples à esquerda */ private static AvlNo RotacaoEsq(AvlNo x1) { AvlNo x2 = x1.dir; x1.dir = x2.esq; x2.esq = x1; x1.altura = max(altura(x1.esq), altura(x1.dir)) + 1; x2.altura = max(altura(x2.dir), x1.altura) + 1; return x2; } /** Rotação dupla à direita */ private static AvlNo RotacaoDuplaDir(AvlNo x3) { x3.esq = RotacaoEsq(x3.esq); return RotacaoDir(x3); } /** Rotação dupla à esquerda */ private static AvlNo RotacaoDuplaEsq(AvlNo x1) { x1.dir = RotacaoDir(x1.dir); return RotacaoEsq(x1); } public AvlNo procurar(int el) { return procurar(raiz, el); } protected AvlNo procurar(AvlNo p, int x) { while (p != null) { /* se valor procuradp == chave do nó retorna referência ao nó */ if (x == p.key) return p; else if (x < p.key) p = p.esq; /* * se valor procurado > chave do nó, procurar na sub-árvore direita * deste nó */ else p = p.dir; } // caso chave não foi achada, retorna null return null; } public void remover(int x) { removerAVL(this.raiz, x); } public void removerAVL(AvlNo atual, int x) { if (atual == null) { return; } else { if (atual.key > x) { removerAVL(atual.esq, x); } else if (atual.key < x) { removerAVL(atual.dir, x); } else if (atual.key == x) { removerAvlNoEncontrado(atual); } } } public void removerAvlNoEncontrado(AvlNo remover) { AvlNo r; if (remover.getEsq() == null || remover.getDir() == null) { if (remover.getPai() == null) { this.raiz = null; remover = null; return; } r = remover; } else { r = sucessor(remover); remover.setKey(r.getKey()); } AvlNo p = null; if (r.getEsq() != null) { p = r.getEsq(); } else { p = r.getDir(); } if (p != null) { p.setPai(r.getPai()); } if (r.getPai() == null) { this.raiz = p; } else { if (r == r.getPai().getEsq()) { r.getPai().setEsq(p);; } else { r.getPai().setDir(p); } balancear(r.getPai()); } r = null; } public AvlNo sucessor(AvlNo q) { if (q.getDir() != null) { AvlNo r = q.getDir(); while (r.getEsq() != null) { r = r.getEsq(); } return r; } else { AvlNo p = q.getPai(); while (p != null && q == p.getDir()) { q = p; p = q.getPai(); } return p; } } public void inorder() { inorder(raiz); } protected void inorder(AvlNo p) { if (p != null) { inorder(p.esq); System.out.print(p.key + " - "); inorder(p.dir); } } public void preorder() { preorder(raiz); } protected void preorder(AvlNo p) { if (p != null) { System.out.print(p.key + " "); preorder(p.esq); preorder(p.dir); } } public void postorder() { postorder(raiz); } protected void postorder(AvlNo p) { if (p != null) { postorder(p.esq); postorder(p.dir); System.out.print(p.key + " "); } } protected AvlNo procurarpai(int x) { AvlNo p = raiz; AvlNo prev = null; while (p != null && !(p.key == x)) { // acha o nó p com a chave x prev = p; if (p.key < x) p = p.dir; else p = p.esq; } if (p != null && p.key == x) return prev; return null; } public void mostrar() { if (isEmpty()) { System.out.println("Árvore vazia!"); return; } System.out.println(raiz.key + "(raiz " + "FB: " + getFator(raiz) + ")" + "\n"); String separator = String.valueOf(" |__"); mostrarSubArvore(raiz.esq, separator); mostrarSubArvore(raiz.dir, separator); } public void mostrarSubArvore(AvlNo No, String separator) { if (No != null) { AvlNo pai = procurarpai(No.key); if (No.equals(pai.esq) == true) { System.out.println(separator + No.key + "(" + "pai: " + pai.key + " FB: " + getFator(No) + ")" + "\n"); } else { System.out.println(separator + No.key + "(" + "pai: " + pai.key + " FB: " + getFator(No) + ")" + "\n"); } mostrarSubArvore(No.esq, " " + separator); mostrarSubArvore(No.dir, " " + separator); } } public static void main(String[] args) { AvlArvore c = new AvlArvore(); c.inserir(1); c.inserir(2); c.inserir(3); c.inserir(4); c.inserir(5); c.inserir(6); c.inserir(7); c.inserir(8); c.inserir(9); c.inserir(10); c.remover(9); c.mostrar(); } }
Mensagens: 2
Participantes: 2