Boa tarde,
Estou estudando árvores, e tenho uma questão que tenho achar o menor
valor em uma árvore DESORDENADA. Segue o código que inicializei, porém
estou com dúvida na questão de achar o menor valor e além do que métodos
de árvore são recursivos.
public int menorValor(Nodo raiz){
int menor = 0;
if(raiz != null){
if(raiz.data < menor){ //Essa parte, é um pouco sem nexo, porque se a árvore é desordenada, não é verificado desta forma
return menorValor(raiz.linke); // raiz a esquerda
}else{
return menorValor(raiz.linkd); //raiz a direita
}
}
}
ola
vc pode criar 2 assinaturas do metodo menorValor
uma que recebe apenas um nó.
outra que recebe o no e o menor valor que vc encontrar e faz a comparação com isso.
assim vc vai procurar se a esquerda tem algo menor que o valor atual, e a direita também.
public int menorValor(Nodo raiz){
return menorValor(raiz.data, raiz);
}
public int menorValor(int menor, Nodo nodo){
// se nodo é null, retorna menor
if( menor > nodo.data ){ menor = nodo.data ; }
int menorEsquerda = menorValor(menor, raiz.linke );
int menorDireita = menorValor(menor, raiz.linkd );
// retorna o menor
}
deve funcionar.
Não entendi a lógica de :
Não seria: if(menor < nodo.data) ?
E a questão do int menorEsquerda e menorDireita, não deveriam estar dentro de um if?
vamos la.
a primeira coisa que vc pode fazer é pensar na arvore mais simples possivel, com apenas 1 item. nesse caso o menor valor é ele mesmo, certo?
depois vamos pensar em uma arvore assim
no principal: 5
no a direita: 2
no a esquerda: 1
os sub nos não tem nada. o que vc vai fazer?
vc pergunta: ei, tem alguem a direita que é menor que 5? SIM o 2.
e a esquerda? SIM o 1.
desses dois, qual o menor? 1. e vc achou o menor valor em uma arvore des-balanceada
e se for
no principal: 5
no a direita: 8
no a esquerda: 1
vc pergunta: ei, tem alguem a direita que é menor que 5? Não, 5 continua sendo o menor a direira.
e a esquerda? SIM o 1.
qual o menor entre 5 e 1? também é o 1.
vc ja percebeu qual a logica desse meu if? se eu quero o menor, eu tenho que verificar sempre se o nodo.data é menor ou não, certo? faz um exercicio em uma folha de papel, o que acontece nesses dois casos que eu passei e cria outros. a folha de papel é sua amiga ( ou colocar um println “fui chamado com menor= x e nodo.data = y” ).
sim, eu deixei isso de proposito pra vc pensar.