BST algoritmasında StackOverflowException

oy
1

Ben bir değer kabul edip ağacın içinde bulunan olup olmadığını görmek için düğümler arasında durmadan kontrol edecek benim BSTree sınıfa yöntemini içerir uygulamaya çalışıyorlar. Ben algoritma doğru olduğunu düşünüyorum, ama deyimi eğer ilk başta StackOverflowException almaya devam niçin bilmiyorum. Herhangi bir fikir?

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
          }
        }        
      }
    }
Oluştur 10/08/2011 saat 04:42
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

senin mantık yanlıştır. Bu dönüş yanlış ifade gitmeyecek.

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
          }
        }        
      }
    }
Cevap 10/08/2011 saat 04:49
kaynak kullanıcı

oy
3

senin koduyla sorun özyinelemeli aramalar içine yanlış düğümü geçiyoruz olmasıdır. senin element ağacındaki her şeyden daha küçük olması, örneğin, varsayalım. Sonra ilk özyinelemeli çağrı, bu ifadeyi vuracak:

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

Bu özyineleme demektir kökü değil, sol çocuk. Böylece bir sonraki denemede, sen eleman kökünün sağ çocuğa daha küçük olduğunu göreceksiniz ve bu yüzden size yığın alanı bitene kadar yinelemeli tekrar tekrar aynı işlevi çağırarak, yine aynı deyimi yürütme gerekir.

Bunu düzeltmek için, okumak için yukarıdaki kodunu değiştirmek gerekir

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

Bu akım düğümün değil kök düğüm kendisinin sol alt ağaç bakmak için söylüyor. Benzer şekilde, sağ kolu için ilgili durum güncellemeniz gerekir.

Son olarak, Ağacın nerde durumda işler sizin özyinelemeli işleve bir baz durumda eklemek gerekir, bu bitirmek nullAğaca kapalı yürüdüm veya ağaç başlamak için boş ya çünkü. Ben bir egzersiz olarak bırakacağız. :-)

Cevap 10/08/2011 saat 04:52
kaynak kullanıcı

oy
0

Sen Özyinelemeyi gerekmez. Az önce büyük bir ağaç olsa bile bu yüzden StackOverflow Geta yok yineleme yapabilirsiniz.

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;
 }
Cevap 10/08/2011 saat 11:47
kaynak kullanıcı

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