2010-02-13 15 views
5

Przeszukuję drzewo, aby znaleźć wartość, która została przekazana. Niestety, to nie działa. Rozpocząłem debugowanie go za pomocą odbitek, a co dziwne, faktycznie znajduje wartość, ale pomija instrukcję return.Przechylanie drzewa w celu znalezienia węzła

/** 
    * 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 
} 

To wypisuje wyniki w następujący sposób:

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) 

nie wiem, czy to pomoże, ale tutaj jest moje drzewo:

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

Dzięki za poświęcony czas.

Odpowiedz

4

Spróbuj tego:

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

Myślę, że należy zwrócić wartość searchNodeBeingDeleted(c, node.getLeft()) i searchNodeBeingDeleted(c, node.getRight()), a nie tylko wywoływać te metody.

+1

rzeczywiście trzeba zwrócić go tylko wtedy, gdy nie jest zerowa – Thirler

+0

@Thirler, masz rację. –

+0

, więc zwracam obie te instrukcje, ale nadal otrzymuję wskaźnik pusty z następującym wynikiem: lewy, lewy, prawy, zerowy błąd zatrzymuje się na prawym węźle, ale wydaje się zwracać wartość pustą, gdy znajdzie ... – JavaFail

1

Używasz rekurencji w swojej funkcji. "Tu", który widzisz, jest wynikiem wywołania funkcji, które zostało utworzone z tej samej funkcji. Więc zwróci wartość do funkcji "recursing", w tym momencie jeszcze nie skończyłeś, mimo że znalazłeś odpowiedź, nadal musisz ją propagować w górę.

2

Zakładając, że drzewo jest binary search tree a nie "regular" binary tree.

Powinieneś zwrócić swoje wywołania rekurencyjne i nie zwracać null na końcu metody.

coś takiego:

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: Nigdzie nie mówi się, że jest to binarne drzewo wyszukiwania. –

+1

@moron, nie, nie, ale 10 węzłów w przykładzie OP są sortowane. Oczywiście może to być zbieg okoliczności ... Nie widzę też powodu, aby utrzymywać wartości przechowywane w drzewie jako "porównywalne", jeśli drzewo nie jest BST. Niemniej jednak masz rację: dodałem swoje założenie do mojej odpowiedzi. –

+0

Usunięto -1. –

Powiązane problemy