Bir İkili Arama Ağacı bir düğümü silme

oy
0

Benim İkili arama ağacı programım deleteNode yöntemini çağırdığınızda silerek olmak görünmüyor. BST onun sadece çalışmıyor düğüm kısmını silerek, mükemmel inşa edilmiştir. Bu gibi benim borusundan diyoruz:

System.out.println(Please enter a number you would like to delete from the tree);
    temp = reader.nextLine();
    try {
        int numTemp = Integer.parseInt(temp);
        TreeNode treeTemp = bst.deleteNode(numTemp, bst.getRoot());
        bst.setRoot(treeTemp);
    }
    catch(Throwable e){
        System.err.println(e);
    }
    bst.printInBST(bst.getRoot());

Benim BinarySearchTree sınıfta ben aşağıdaki gibi benim deleteNode yöntemlerini uygulamak:

public TreeNode deleteNode(int x, TreeNode temp){
    if(temp != null){
        if(x > (int)((Integer)temp.getValue())){
            temp.setLeft(deleteNode(new Integer(x), temp.getLeft()));
        }
        else if(x < (int)((Integer)temp.getValue())){
            temp.setRight(deleteNode(new Integer(x), temp.getRight()));
        }
        else if(temp.getLeft() != null & temp.getRight() != null){
            TreeNode temp2 = new TreeNode(temp.getRight().getValue());
            while(temp2.getLeft() != null){
                temp2 = temp2.getLeft();
            }
            temp = temp2;
            temp.setRight(remove(temp.getRight()));
        }
    }
    return temp;
}
public TreeNode remove(TreeNode temp){
        if(temp.getLeft() != null){
            temp.setLeft(remove(temp.getLeft()));
            return temp;
        }
        else {
            return temp.getRight();
        }
}
Oluştur 08/10/2011 saat 18:52
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
0

Bu tek sorun olmakla birlikte, gerektiği takdirde% 100 emin değil:

else if(temp.getLeft() != null & temp.getRight() != null)

Aslında be:

else if(temp.getLeft() != null && temp.getRight() != null)

yani yalnızca bir tane & "ve" işlem, iki tane gerekirken için var?

Cevap 08/10/2011 saat 19:25
kaynak kullanıcı

oy
2

Sana işlememesi düşünüyorum

örnek 1: silme düğüm bir yaprak düğümü

case 2: silme düğüm sadece 1 çocuğu var


Başka kısmı böyle bir şey olmalı eğer.

else if( temp.getLeft() != null && temp.getRight() != null ) // Two children
{
      temp.setValue( findMin( temp.getRight() ).getValue());
      temp.setRight ( deleteNode( temp.getValue(), temp.getRight() );
}
else
     temp = ( temp.getLeft() != null ) ? temp.getLeft() : temp.getRight();

return temp;

findMin yöntemi düğümün inorder halefi Silinecek bulmaktır.

private TreeNode findMin( TreeNode t )
{
        if( t == null )
            return null;
        else if( t.getLeft() == null )
            return t;
        return findMin( t.getLeft() );
}

Ben bu sorunuza cevap umuyoruz.

Cevap 08/10/2011 saat 20:39
kaynak kullanıcı

oy
1

Okunaklı kod yazma daha kolay hata tespitini kolaylaştırır - hem kendiniz ve başkaları tarafından. Bir ilk adım daha anlamlı değişken isimleri seçmektir temp, temp2ve treeTemp.

Ayrıca, yapmak gerçekten gerekli değildir new Integer(x)türde bir yöntem parametresini atamak int. Basitçe yazma xyerine aynı etkiye sahiptir, daha hızlı çalışma zamanında ve daha kolay önemli olan kod noktaya yapar.

böcek gelince, görüyorum ilki:

TreeNode temp2 = new TreeNode(temp.getRight().getValue());

Yani TreeNode bir kopyasını oluşturur. Bu kopyayı değiştirilmesi orijinal düğümü etkilemez. Ayrıca, kopya muhtemelen yok leftya rightsadece pass beri, set valuekurucusuna. Eğer bir kopyası gerekiyor düşünüyorum Acaba neden? Sonuçta, burada ikisini de oluşturmaz:

deleteNode(new Integer(x), temp.getRight())

Silmek Düğüm az 2 çocuğu varsa Sashwat, işaret ettiği gibi Sonra, kodunuzu şartların hiçbirinin, hiçbir şey yapmaz deleteNodemaçları.

Cevap 09/10/2011 saat 00:01
kaynak kullanıcı

oy
0
  public class BSTNode {

  public boolean remove(int value, BSTNode parent) {
        if (value < this.value) {
              if (left != null)
                    return left.remove(value, this);
              else
                    return false;
        } else if (value > this.value) {
              if (right != null)
                    return right.remove(value, this);
              else
                    return false;
        } else {
              if (left != null && right != null) {
                    this.value = right.minValue();
                    right.remove(this.value, this);
              } else if (parent.left == this) {
                    parent.left = (left != null) ? left : right;
              } else if (parent.right == this) {
                    parent.right = (left != null) ? left : right;
              }
              return true;
        }
  }
Cevap 29/01/2013 saat 18:54
kaynak kullanıcı

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