Eu sou um iniciante em Java e estou atualmente tentando resolver um exercício no capítulo Trees.
Uma árvore é formada por esses nós. digite descrição da imagem aqui . Um nó contém um valor que corresponde a um número inteiro. Além do nó na raiz da árvore, um nó sempre tem apenas um outro nó que as referências de TI. Se um nó não tem filho para a direita ou para a esquerda, então a referência correspondente é null
. o valor realizado por qualquer criança na subárvore à esquerda é menor que o valor de seu pai e o valor mantido por qualquer criança na subárvore da direita é maior que o valor de seu pai. a altura da árvore é entre 0 e 100 000 knots.
Eu estou tentando implementar um find(int v)
método que retorna o nó segurando o valor v
se o nó não existe, então, encontrar terá que voltar null
.
Isto é o que eu tenho feito até sei, mas eu sou um pouco perdido:
class Node{
Node left, right;
int value;
public Node find (int v){
Node result = null;
if (this.left != null) result = find(v);
if (this.value == v) return this;
if (result == null && this.right != null)
result = find(v);
return result;
}
public static void main (String[] args){
Node n = smallNode.find(8);
System.out.println(n);
n = LargestNode.find(0);
System.out.println(n);
}
}
Estou recebendo um StackoverOverflowError
nesta linha:
if (this.left != null) result = find(v);
O que estou fazendo de errado ? Não consigo encontrar porque ele está a aumentar essa exceção.
Você deve verificar o valor primeiro, o retorno this
se o nó tem o valor que você está procurando. Se ele não verifica você pode continuar a partir do nó atual e ir para a direita, depois de ter retornado verificar o resultado com o valor dado, se o retorno correto que Node, caso contrário retorna qualquer que seja o lado esquerdo dá. Ele quer será o nó com o valor que você quer ou nulo.
public Node find (int v){
Node result = null;
//check for value first
if (this.value == v) return this;
//check if you can go any further from the current node
if(this.left == null && this.right == null) return null;
//now go right
result = this.right.find(v);
//check the node
if(result != null && result.value == v) return result;
//if not found return whatever is returned by searching left
return this.left.find(v);
}