C ++ bağlantılı ikili arama ağacı (DeleteTree)

oy
0

Ben atamaları biri için C ++ kullanarak bir ikili arama ağacı uygulamak zorunda. Ben sınıf oluşturulur ve uygulamaya teşebbüs ettik InsertItem, PrintTree, DeleteTree sınıf için yöntemler, ben her şeyi doğru yaptım ama nedense benim program çökmesini tutar düşünüyorum :(

İşte benim kod:

PrintTree Yöntemi

template <class TItem>
void BinarySearchTree<TItem>::PrintTree()
{
    PrintTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::PrintTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    cout << Node->Data << endl;
    PrintTree(Node->LeftChild);
    PrintTree(Node->RightChild);
}

DeleteTree Yöntemi

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree()
{
    DeleteTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    DeleteTree(Node->LeftChild);
    DeleteTree(Node->RightChild);

    delete Node;
}

Yöntemin Benim dizisi programı çöker kadar çağırır:

Ben öğeleri eklemek F,B,G,A,D,I,C,E,H: iyi çalışıyor

Ben buna PrintTree(): iyi çalışır

Ben buna DeleteTree(): iyi çalışır

Ben buna PrintTree()yine: Program çöküyor

Nedense ifadesi if(RootNode == NULL)sonrasında gerçek dönmüyor DeleteTree()yöntemi denir program mevcut ve çöker olmayan bir şeyi yazdırmaya çalışan, böylece. Bunu neden oluyor emin değilim, yanlış burada ne işim var?

Her türlü yardım takdir edilmektedir.

Oluştur 07/11/2011 saat 23:16
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Arayan işaretçi sıfırlamamaktadır gelmez "delete". Sen yapmak isteyeceksiniz:

delete Node; 
Node = nullptr;

DÜZENLE:

Gittiğiniz gibi işaretçileri sarkan temizlemek, böylece adresi ile gösterici aktarırsanız:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);
Cevap 07/11/2011 saat 23:20
kaynak kullanıcı

oy
2

Ben silme fonksiyonu aşağıdakine değiştirilmesi gerektiğini düşünüyorum

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode** Node)
{
    if((*Node) == NULL)
        return;

    DeleteTree(&(*Node)->LeftChild);
    DeleteTree(&(*Node)->RightChild);

    delete (*Node);
    (*Node) = NULL;
}

Yanlışım varsa lütfen düzelt.

Cevap 07/11/2011 saat 23:28
kaynak kullanıcı

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