java ikili arama ağacı

oy
0

Ben bir düğüm (kök) bir çocuğu kaldırmak nasıl hakkında bir sorum var? Ben kaldırmak arayamam beri çocuk null yapmak, eğer o çocuğun çocukları yukarı hareket edecek? Gibi, sadece boş olarak başlatmak istiyorum ?? Ya da çocuğun çocuğa işaret eder?

Oluştur 31/10/2009 saat 20:40
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
2

Geleneksel ikili arama ağacında bir düğüm çıkarılması düğüm vardır kaç çocuk bağlı olarak farklı sonuçlar doğurabilir:

  • Hiçbir çocuklu bir düğüm basitçe kaldırılabilir
  • bir çocuk bir düğüm kaldırılabilir ve düğüm onun tek çocuk tarafından değiştirilecektir. Bu bakılmaksızın çocuk sol veya sağ alt olmasından bağımsız olarak geçerlidir.
  • İki çocuklu bir düğüm biraz daha karmaşık bir kural vardır: bulmalısınız içinde sipariş halefi veya in-order selefi sonra halefi veya hakkın önceki silmek onun sucessor en ya selefinin değeri ile cari düğümün değerini değiştirin kaldırılacak düğümün (bu kurallara uygun olarak).
Cevap 31/10/2009 saat 20:49
kaynak kullanıcı

oy
0

Bu ödev mi? Bunda yanlış bir şey yok ... biz sadece insanların öğrenmesine yardımcı ziyade onlara cevaplar anlatmak istiyorum.

Sadece çocuk düğümü ayarlamak Eğer oğul çocuklar hakkında herhangi bir bilgi kaybedersiniz null.

Cevap 31/10/2009 saat 20:51
kaynak kullanıcı

oy
0

Standart bir ağaç sınıfı genellikle bir dizi veya Koleksiyonu sıkışmış onun çocuğu bilecek - bir ikili ağacın durumunda, sadece bu yüzden sabit bir büyüklükte dizi çalışacak iki direkt çocukları var. Bu nedenle, genellikle çocuk çocukların bu listeden kaldırılacak: çağrıları "removeMe" yöntemi çeşit uygulamak.

Yukarıda belirtildiği gibi kaldırmakta olduğunuz çocuk çocuklar varsa, bu karmaşıklaşıyor.

Cevap 31/10/2009 saat 21:33
kaynak kullanıcı

oy
0

Tim'in cevabı iyi görünüyor. Ama evet üç şeyden biri o senin çıkarmadan olan çocuğun ne tür bağlı olarak yapmak isteyecektir. Bir çocuğun boş yaparsanız bunlara başvuru kaybettim çünkü bunun çocukları yukarı hareket etmeyecektir. Bunun yerine, sizin kaldırarak çocuğun sol veya sağ çocuklar senin kaldırarak çocuğa işaretçi işaret ayarlanması gerekir belirlemek isteyeceksiniz. Eğer ayarladıktan sonra önceki çocuğa işaretçi (sol veya sağ) (sol veya sağ) senin çıkarmadan düğümün, sen alışkanlık (null değerine yapabilirsiniz ayarlamak için gidecekseniz gerek o düğüme artık bir başvuru var düğümlerin' artık t erişim onu. Eğer klasik BST değil bu durumda doubly bağlı BST çeşit yazdı sürece)

Cevap 01/11/2009 saat 00:20
kaynak kullanıcı

oy
0

Bu kod size yardımcı olacaktır

public Node<T> getParentOf(Node<T> child){
    findParentOf(this.root, child);
    return temp;
}

private void findParentOf(Node<T> ROOT, Node<T> child){
    if(ROOT.hasLeft()){
        findParentOf(ROOT.left, child);
    }

    if(ROOT.left == child || root.right == child){
        temp = ROOT;
    }

    if(ROOT.hasRight()){
        findParentOf(ROOT.right, child);
    }
}


private void replaceNode(Node<T> original, Node<T> newNode){
    Node<T> tempParent = getParentOf(original);
    if(original == tempParent.left){
        tempParent.left = newNode;
    }else if(original == tempParent.right){
        tempParent.right = newNode;
    }
}

private void traverseChildrenAndAdd(Node<T> newParent, Node<T> oldParent){
    newParent.insert(oldParent.data);
    if(oldParent.hasLeft()){
        traverseChildrenAndAdd(newParent,oldParent.left);
    }



    if(oldParent.hasRight()){
        traverseChildrenAndAdd(newParent,oldParent.right);
    }
}
private void deleteNode(Node<T> ROOT, Node<T> d){
    if(d.data.compareTo(ROOT.data) < 0){
        deleteNode(ROOT.left, d);
    }else if(d.data.compareTo(ROOT.data) > 0){
        deleteNode(ROOT.right, d);
    }else if(d == this.root){
        if(this.root.hasLeft()){
            traverseChildrenAndAdd(root.left, root.right);
            root = root.left;
        }else if(root.hasRight()){
            root = root.right;
        }else{
            root = null;
        }
    }else{
        if(ROOT.hasLeft()&&ROOT.hasRight()){
            Node<T> successor = getMinNode(ROOT);
            replaceNode(successor, successor.right);
        }else if(ROOT.hasLeft() || ROOT.hasRight()){
            if(ROOT.hasLeft()){
                replaceNode(ROOT, ROOT.left);
            }else{
                replaceNode(ROOT, ROOT.right);
            }
        }else{
            replaceNode(ROOT, null);
        }
    }
}

public void remove(T data){
    deleteNode(this.root, new Node<T>(data));
}
Cevap 13/02/2011 saat 10:14
kaynak kullanıcı

oy
0

Bunu (sözde kod) gibi bir şey yapabilirsiniz:

Silmek ağaç "root" ve düğümün kök veya bazı veriler bir Verilen aşağıdaki "x" do

 if x < root
      recurse to left child
 if x > root
      recurse to right child
 else //node found
      find the min item of the node right child //min item should be left most leaf node node
      replace the value of the node you want to delete with min nodes value
      now delete the min node
 return root;

kod:

delete(Node root, Object x){
    if(root == null){
        return null;
    }

    if(data < root.data){
        root = delete(root.left);
    }else if(root.data < data){
        root = delete(root.right);
    }else{
        if(root.left != null && root.right != null){
            Object tmp = findMin(root.right);
            root.data = tmp;
            root.right = delete(root.right, tmp);
        }else{
            return (root.left != null) ? root.left : root.right;    
        }
    }
return root;

}

Cevap 09/09/2014 saat 20:33
kaynak kullanıcı

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