2010-02-13 4 views
5

Je cherche dans un arbre pour trouver une valeur qui est passée. Malheureusement ça ne marche pas. J'ai commencé à le déboguer avec des impressions, et ce qui est bizarre, c'est qu'il trouve la valeur, mais ignore l'instruction return.Traversée d'un arbre pour trouver un nœud

/** 
    * Returns the node with the passed value 
    */ 
private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node) 
{ 
    if(node == null) 
    { 
    return null; 
    } 

    if(c.equals((Comparable)node.getValue())) 
    { 
    System.out.println("Here"); 
    return node; 
    } 
    else 
    { 
    if(node.getLeft() != null) 
    { 
    System.out.println("left"); 
    searchNodeBeingDeleted(c, node.getLeft()); 
    } 
    if(node.getRight() != null) 
    { 
    System.out.println("right"); 
    searchNodeBeingDeleted(c, node.getRight()); 
    } 
    } 
    return null; //i think this gives me my null pointer at bottom 
} 

Il imprime les résultats comme suit:

left 
left 
right 
right 
Here 
right 
left 
right 
left 
right 
Exception in thread "main" java.lang.NullPointerException 
at Program_14.Driver.main(Driver.java:29) 

Je ne sais pas si cela va aider, mais voici mon arbre:

 L 
/ \ 
    D  R 
/\ /\ 
A F M U 
\  /\ 
    B  T V 

Merci pour votre temps.

Répondre

4

Essayez ceci:

private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node) 
{ 
    if(node == null) 
    { 
    return null; 
    } 

    if(c.equals((Comparable)node.getValue())) 
    { 
    System.out.println("Here"); 
    return node; 
    } 
    else 
    { 
    if(node.getLeft() != null) 
    { 
    System.out.println("left"); 
    TreeNode n = searchNodeBeingDeleted(c, node.getLeft()); 
    if (n != null) { 
     return n; 
    } 
    } 
    if(node.getRight() != null) 
    { 
    System.out.println("right"); 
    TreeNode n = searchNodeBeingDeleted(c, node.getRight()); 
    if (n != null) { 
     return n; 
    } 
    } 
    } 
    return null; //i think this gives me my null pointer at bottom 
} 
1

Je pense que vous devez retourner la valeur de searchNodeBeingDeleted(c, node.getLeft()) et searchNodeBeingDeleted(c, node.getRight()), et pas seulement appeler ces méthodes.

+1

en fait, vous devez le retourner que si elle est non nulle – Thirler

+0

@Thirler, vous avez raison. –

+0

donc je retourne ces deux instructions, mais je reçois toujours le pointeur nul avec la sortie suivante: gauche, gauche, droite, erreur nulle il s'arrête au bon noeud, mais semble retourner nulle quand il le trouve ... – JavaFail

1

Vous utilisez la récursivité dans votre fonction. Le 'ici' que vous voyez est le résultat d'un appel de fonction qui a été créé à partir de la même fonction. Donc, il va retourner une valeur à la fonction 'récursive', à ce stade, vous n'avez pas encore terminé, même si vous avez trouvé la réponse, vous devez toujours continuer à la propager vers le haut.

2

En supposant que votre arbre est un binary search tree et non un "regular" binary tree.

Vous devriez retourner vos appels récursifs et ne pas retourner null à la fin de votre méthode.

Quelque chose comme ceci:

private TreeNode searchNodeBeingDeleted(Comparable c, TreeNode node) { 
    if(nodle == null) return null; 
    int diff = c.compareTo((Comparable)node.getValue()); 
    if (diff == 0) { // yes, we found a match! 
     System.out.println("Here"); 
     return node; 
    } 
    else if (diff < 0) { // traverse to the left 
     System.out.println("left"); 
     return searchNodeBeingDeleted(c, node.getLeft()); 
    } 
    else { // traverse to the right 
     System.out.println("right"); 
     return searchNodeBeingDeleted(c, node.getRight()); 
    } 
} 
+0

- 1: Nulle part ne dit que c'est un arbre de recherche binaire. –

+1

@moron, non, mais les 10 noeuds de l'exemple OP sont triés. Pourrait être une coïncidence bien sûr ... Aussi, je ne vois aucune raison de garder les valeurs stockées dans l'arbre comme 'Comparable' si l'arbre n'est pas un BST. Néanmoins, vous avez un point: j'ai ajouté ma supposition à ma réponse. –

+0

Suppression du -1. –

Questions connexes