[RESOLVIDO] getTio BTree

2 respostas
L

Boa noite a todos

Estou enfrentando uma certa dificuldade com um algoritmo sobre arvores binárias de pesquisa (e um pouco de recursividade tbm :smiley: ).

Segue meu código:

public boolean getPai(Node node, int valor) {
		if (node == null)
			return false;
		
		if (node.data == valor)
			return false;
		
		if (node.left != null && node.left.data == valor || node.right != null && node.right.data == valor)
			return true;
		
		if (valor < node.data)
			return getPai(node.left, valor);
		else
			return getPai(node.right, valor);
	}

	public int getTio (int valor) {
		return getTio(root, valor);
	}
	
	public int getTio(Node node, int valor) {
		if (node.data == valor)
			return -1;
		
		if (node.left != null && getPai(node.left, valor) == true)
			return node.left.left.data;
		
		if (node.right != null && getPai(node.right, valor) == true)
			return node.right.right.data;
		
		if (valor < node.data) 
			return getTio(node.left, valor);
		
		else
			return getTio(node.right, valor);
	}

esse getTio n funciona de jeito nenhum…

gostaria de saber se alguem pode me dar uma dica…

Obrigado!

2 Respostas

jc_caetano

Boa noite lodeyro,

Creio que seus if podem ser substituidos por else if.
Com isso seu programa não executará todos os trechos, por exemplo:

public int getTio(Node node, int valor) {
		if (node.data == valor)
			return -1;
		
		if (node.left != null && getPai(node.left, valor) == true)
			return node.left.left.data;
		
		if (node.right != null && getPai(node.right, valor) == true)
			return node.right.right.data;

		if (valor < node.data) 
			return getTio(node.left, valor);
		
		else
			return getTio(node.right, valor);
	}

Se o 2º e o 3º if forem true o programa executará os dois o que será desnecessário, afinal você já tem sua resposta no primeiro if, além disso você perde desempenho testando todas as possibilidades.

L

Consegui resolver o problema pessoal. O que estava atrapalhando minha vida era a pesquisa recursiva que eu fazia no getPai que era desnecessária, sendo assim segue o código corrigido.

public boolean getPai(Node node, int valor) {
		
		if (node == null)
			return false;

		else if (node.data == valor)
			return false;
		
		else if (node.left != null && node.left.data == valor || node.right != null && node.right.data == valor) 
			return true;
		return false;
		
	}
	
	public int getTio (int valor) {
		return getTio(root, valor);
	}
	
	private int getTio (Node node, int valor) {
		if (node == null)
			return -1;
	
		else if (node.data == valor)
			return -1;
		
		else if (getPai(node.right, valor)) 
			return node.left.data;
		
		else if (getPai(node.left, valor))
			return node.right.data;
		
		if (valor < node.data)
			return getTio(node.left, valor);
		
		else
			return getTio(node.right, valor);
	}

Muito obrigado pela dica com os else if… realmente nem tinha me tocado.

Criado 20 de maio de 2012
Ultima resposta 20 de mai. de 2012
Respostas 2
Participantes 2