Java İkili Arama Ağacı Görselleştirme

oy
1

Merhaba Şu anda projemin (Algoritma Görselleştirme Aracı) test sürecinden yapıyorum. Benim BST silme yöntemi ile ilgili bir sorun alıyorum.

 public boolean delete(String key) {
boolean deleted = true;
boolean finished=false;
BNode current = root;
BNode prev = null;
while (!finished) {
  if (key.compareTo(current.key) > 0) {
    prev = current;
    current = current.right;
    this.repaint();
  }
  else if (key.compareTo(current.key) < 0) {
    prev = current;
    current = current.left;
    this.repaint();
  }
  else if (key.compareTo(current.key) == 0) {
      finished=true;
      this.repaint();
  }

}

if (check(current) == 0) {
    if(current==root)
    {
        root=null;
        xPos=400;
        yPos=60;
        this.repaint();
    }
    else
    {
        if (current.key.compareTo(prev.key) > 0) {
            prev.right = null;
            this.repaint();
        }
        else if(current.key.compareTo(prev.key) < 0) {
            prev.left = null;
            this.repaint();
        }
    }

}
else if (check(current) == 1) {
    if(current==root)
    {
        prev=current;
        if (current.left != null) {
            current=current.left;
            prev.key=current.key;
            prev.left = current.left;
            this.repaint();
        }
        else {
            current=current.right;
            prev.key=current.key;
            prev.right = current.right;
            this.repaint();
        }
    }
    else
    {

    if (current.key.compareTo(prev.key) > 0) {
    if (current.left != null) {
      prev.right = current.left;
      this.repaint();
    }
    else {
      prev.right = current.right;
      this.repaint();
    }
  }
  else if(current.key.compareTo(prev.key) < 0) {
    if (current.left != null) {
      prev.left = current.left;
      this.repaint();
    }
    else {
      prev.left = current.right;
      this.repaint();
    }
  }
    }
}
else if (check(current) == 2) {
  BNode temp = inord(current);
  if(current==root)
  {
      root.key=temp.key;
      this.repaint();
  }
  else
  {

      if (current.key.compareTo(prev.key) > 0) {
      prev.right.key = temp.key;
      this.repaint();
    }
    else {
      prev.left.key = temp.key;
      this.repaint(0);
    }
    }
}

return deleted;}

BST sınıfının kendisi için kod çok daha uzundur. Ben girdi olarak örnek 9 ve 10 için kullandığınızda hiçbir çocukla, bir nullpointer istisna olsun bir düğüm silmeye geldiğinde herşey dışında iyi çalışıyor asla (del 10'a kadar deneyin) veya 5 ve 12 (del 12'ye deneyin) ancak Örneğin 4 ve 8 için ben kullanıcı veya 9, 6 ve 5. (del 8'e deneyin) eğer sorun compareTo ile olduğunu düşünüyorum.

int check(BNode a) {
int ret;
if ( (a.left != null) && (a.right != null)) {
  ret = 2;
}
else if ( (a.left == null) && (a.right == null)) {
  ret = 0;
}
else {
  ret = 1;
}
return ret;}

Gerçekten .. Teşekkür edilmesi gerektiğinde bütün dersleri gönderebilir This.I ile yardıma ihtiyacım var!

Oluştur 24/03/2011 saat 17:42
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Sadece birkaç not:

  1. Kontrol etmek boş geçerseniz, orada bir NPE iyi olur.
  2. if( check(current) == 0) vs -> bir kez kontrol edip eğer (hatta bir anahtarı) uygulamalıdır

2 için örnek .:

 int result = check(current);
 switch(result) {
  case 0:
    //do whatever is appropriate
    break;
  case 1:
    //do whatever is appropriate
    break;
  case 2:
    //do whatever is appropriate
    break;
  default:
    //should never happen, either leave it or throw an exception if it ever happens
}

Düzenleme: Aslında, bu düzenlemeyi unutmak // sadece bu olmamalıdır gördük, ama yine de iyi bir tarzı değil

Ayrıca kodunda bu gibi şeyler vardır:

if (current.left != null) {
    current=current.left;
    prev.key=current.key;
    prev.left = current.left;
    this.repaint();
}
else {
    current=current.right; //this might be null
 ...
}

Eğer current.leftboş ve current.rightboş olduğunu currentsonradan boş olacaktır.

Cevap 24/03/2011 saat 18:04
kaynak kullanıcı

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