Estrutura de dados 2, ARVORES

5 respostas Resolvido
java-sejava7programaçãojavafxjava
A

Pessoal me ajude a criar o metodo para remover o elemento da minha arvore ja criei o inserir e o pesquisar falta o remover,
segue o codigo criado…

public class ArvoreBinaria {

No raiz;

public void inserir(int valor) {
    if (raiz == null) {
        raiz = new No(valor);
    } else {
        No novo = new No(valor);
        inserir(raiz, novo);
    }
}

private void inserir(No arvore, No novo) {
    if (arvore.valor == novo.valor) {
        return;
    }
    if (novo.valor > arvore.valor) {
        if (arvore.direito == null) {
            arvore.direito = novo;
        } else {
            inserir(arvore.direito, novo);
        }
    } else {
        if (arvore.esquerdo == null) {
            arvore.esquerdo = novo;
        } else {
            inserir(arvore.esquerdo, novo);
        }
    }
}

public boolean pesquisar(int valor) {
    return pesquisarElem(raiz, valor);
}

private boolean pesquisarElem(No arvore, int valor) {
    if (arvore == null) {
        return false;
    }
    if (valor == arvore.valor) {
        return true;
    }
    if (valor > arvore.valor) {
        return pesquisarElem(arvore.direito, valor);
    } else {
        return pesquisarElem(arvore.esquerdo, valor);
    }
}

public void imprimirEmOrdem() {
    emOrdem(raiz);
}

private void emOrdem(No arvore) {
    if (arvore == null) {
        return;
    }
    emOrdem(arvore.esquerdo);
    System.out.println(arvore.valor);
    emOrdem(arvore.direito);
}

public void imprimirPreOrdem() {
    preOrdem(raiz);
}

private void preOrdem(No arvore) {
    if (arvore == null) {
        return;
    }
    System.out.println(arvore.valor);
    preOrdem(arvore.esquerdo);
    preOrdem(arvore.direito);
}

public void imprimirPosOrdem() {
    posOrdem(raiz);
}

private void posOrdem(No arvore) {
    if (arvore == null) {
        return;
    }
    posOrdem(arvore.esquerdo);
    posOrdem(arvore.direito);
    System.out.println(arvore.valor);
}

}

a outra classe é a classe no

public class No {

int valor;
No direito;
No esquerdo;

public No(int valor) {
    this.valor = valor;
}

public int getValor() {
    return valor;
}

public void setValor(int valor) {
    this.valor = valor;
}

public No getDireito() {
    return direito;
}

public void setDireito(No direito) {
    this.direito = direito;
}

public No getEsquerdo() {
    return esquerdo;
}

public void setEsquerdo(No esquerdo) {
    this.esquerdo = esquerdo;
}

}

5 Respostas

B

Pra você remover é so usar o teu “pesquisar” passando o no que vc quer remover e quando pegar o retorno atribuir nulo pra ele

A

dê uma dica como iniciar por favor

B
Solucao aceita

Primeiro tu vai verificar se o no que vc passou existe na arvore.

if(!pesquisar(no) ) {
    inserir(no);
} else {
   excluir( No arvore, int valor );
}  

public No remove(int valor){return remover(this.raiz , valor);}

private No remover(No no, int valor){
        if(this.raiz == null){
           retunr null
        } else {            
            if(valor < no.valor){
                no.esquerda(remover(no.esquerda, valor));
            } else if(valor > no.valr){
                no.direita(remover(no.direita, valor));
            } else if (no.direita != null && no.direita != null) {
                System.out.println(" No " + no.valor);
                no.valor(encontraMin(no.direita).valor);
                no.direita(removeMin(no.direita);
            } else {  
                System.out.println("  Removeu No " + no.valor);  
                no = (no.esquerda() != null) ? no.esquerda() : no.direita();  
            }  
            return no;
        }
    }

private No removeMin(No no) {  
    if (no == null) {  
        System.out.println("  erro ao remover " +no.valor);  
    } else if (no.esquerda() != null) {  
        no.esquerda(removeMin(no.esquerda()));  
        return no;  
    } else {  
        return no.direita();  
    }  
    return null;  
}  

private No encontraMin(No no) {  
    if (no != null) {  
        while (no.esquerda() != null) {  
            no = no.esquerda();  
        }  
    }  
    return no;  
}
A

amigo tem necessidade esse remover minimo?
se eu tirar esse remover minimo no meu codigo remover la onde tem remover Min, o que poderia ser colocado?

B

Se vc não executar o trecho de código ele vai podar a arvore independente se tiver filhos a esquerda ou a direita do no que foi passado por parâmetro. Se falta de informação e, ou, inconsistência dos dados não for uma preocupação no seu trabalho ou estudo é só arrancar o código e deixar sem mesmo. Abraços

Criado 30 de agosto de 2017
Ultima resposta 1 de set. de 2017
Respostas 5
Participantes 2