StackOverFlowException a BST algoritmus

szavazat
1

Megpróbáltam, hogy végre egy Tartalmaz módszer az én BSTree osztály, amely elfogadja az érték, majd ellenőrizze át az összes csomópontot, hogy ha benne van a fán. Úgy vélem, hogy az algoritmus helyes, de nem tudom, hogy miért kapok egy StackOverFlowException az első if. Bármilyen ötletet?

public Boolean Contains(T item)
    {
      Node<T> node = root;
      return contains(root, item);
    }



    private Boolean contains(Node<T> node, T item)
    {
      if (item.CompareTo(root.Data) == 0)
      {
        return true;//return 0 if found
      }
      else
      {
        if (item.CompareTo(root.Data) > 0)
        {
          //root = node.Left;
          Node<T> left = root.Left;
          return(contains(root, item));
        }
        else
        {
          if (item.CompareTo(root.Data) < 0)
          {
            //root = node.Right;
            Node<T> right = root.Right;
            return(contains(root, item));
          }
          else
          {
            return false;//return 1 if not found
          }
        }        
      }
    }
A kérdést 10/08/2011 04:42
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

a logika hibás. Ez nem fog menni a visszatérő hamis állítás.

private Boolean contains(Node<T> node, T item)
    {
      if (item.CompareTo(root.Data) == 0)
      {
        return true;//return 0 if found
      }
      else///if 0 <> 
      {
        if (item.CompareTo(root.Data) > 0)  //if 0<
        {
          //root = node.Left;
          Node<T> left = root.Left;
          return(contains(root, item));
        }
        else  //if 0>
        {
          if (item.CompareTo(root.Data) < 0) if // 0>
          {
            //root = node.Right;
            Node<T> right = root.Right;
            return(contains(root, item));
          }
          else  // this will be not executed ever
          {
            return false;//return 1 if not found
          }
        }        
      }
    }
Válaszolt 10/08/2011 04:49
a forrás felhasználó

szavazat
3

A probléma a kódot, hogy te halad a rossz csomópontot a rekurzív hívások. Tegyük fel például, hogy az elem kisebb, mint mindent a fán. Aztán az első rekurzív hívás, akkor nyomja ezt a kijelentést:

Node<T> left = root.Left;
return(contains(root, item));

Ez azt jelenti, hogy recurse a gyökér , nem a bal gyerek. Így a következő iteráció, rájössz, hogy az elem kisebb, mint a jobb gyermek a gyökér, és így lesz végre pontosan ugyanazt a nyilatkozatot ismét rekurzív hívás az azonos funkciójú többször, amíg elfogy a verem helyet.

Ennek javításához meg kell változtatni a fenti kódot olvasni

Node<T> left = node.Left;
return(contains(left, item));

Ez azt mondja, hogy nézd a bal részfa az aktuális csomópont, nem a gyökér is. Hasonlóképpen, akkor frissítenie kell a megfelelő esetben a megfelelő ágat.

Végül, hogy befejezze ezt le, akkor meg kell adni a kiinduló helyzet, a rekurzív függvény, amely kezeli az esetben, ha a fa null, vagy azért, mert már elindult a fa vagy a fa üres volt, hogy kezdődik. El fogom hagyni ezt az edzés során. :-)

Válaszolt 10/08/2011 04:52
a forrás felhasználó

szavazat
0

Nem kell a rekurziót. Tudod csak hajtogat, így nem Geta StackOverflow akkor is, ha van egy hatalmas fa.

public Boolean Contains(T item) {
    Node<T> currentNode = root;

    while(currentNode != null) { // Or whatever you use to signal that there is no node.
        switch(item.CompareTo(currentNode.Data)) {
            case -1:
                currentNode = currentNode.Right;
                break;
            case 1:
                currentNode = currentNode.Left;
                break;
            default: // case 0
                return true;
        }
    }
    return false;
 }
Válaszolt 10/08/2011 11:47
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more