Neden benim C ++ kod benim BST tüm düğümleri silmek başarısız?

oy
1

Bu kök düğüm içeren bir BST geçmeli ve her düğümü silmek gerekiyordu. Ancak sonunda, ben mesajı kök hala sol düğüm vardır. Olsun Neden tüm düğümler silinmez?

void deleteTree()
{   
    deleteNode(root);
    if(root->right)
        cout << root still has a right node << endl;
    if(root->left)
        cout << root still has a left node << endl;
    root = 0;

}   

void deleteNode(node *p) 
{   
    if(p->left) 
    {   
        deleteNode(p->left);
        p->left = 0;
    }   
    if(p->right) 
    {   
        deleteNode(p->right);
        p->right = 0;
    }   

    cout << Deleting node containing  << p->data << endl;
    delete p;
}   
Oluştur 11/02/2010 saat 03:57
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
6

Sizin siliyorsunuz pucunda (at root) ve daha sonra onun içeriğini erişmeye çalışan deleteTree(), nereye rootayrılan belleğe artık puan. Sonuç tanımsız olacak.

Cevap 11/02/2010 saat 04:00
kaynak kullanıcı

oy
2

Sen siliyorsunuz root. Ve sonra kod nerede olduğunu bellek erişmeye çalışıyor.

Orada tanımsız-davranış arazi içine durumdayız.

Cevap 11/02/2010 saat 04:01
kaynak kullanıcı

oy
2

Sen KQUEUE olmamalı rootsen onu sildikten sonra deleteNode. Neden incelemek için bir hata ayıklayıcı kullanın root->leftboş olmayan.

Cevap 11/02/2010 saat 04:01
kaynak kullanıcı

oy
2

Sen bakıyorsun root->leftyeni bir tahsis blokta kullanılmak üzere avalable yapma, zaten silindikten sonra root.

Cevap 11/02/2010 saat 04:02
kaynak kullanıcı

oy
-1

Ben sadece o zaman başa kolay olurdu, ağaç kendisini değiştirecek:

struct Node
{
  Node(data_type data): mLeft(), mRight(), mData(data) {}
  Node(const Node& rhs): mLeft(), mRight(), mData(rhs.mData)
  {
    if (rhs.mLeft.get()) mLeft.reset(new Node(*rhs.mLeft));
    if (rhs.right.get()) mRight.reset(new Node(*rhs.mRight));
  }
  Node& operator=(Node rhs)
  {
    this->swap(rhs);
    return *this;
  }
  ~Node() { }

  void swap(Node& rhs)
  {
    using std::swap;
    swap(mLeft, rhs.mLeft);
    swap(mRight, rhs.mRight);
    swap(mData, rhs.mData);
  }

  Node* left() const { return mLeft.get(); }
  void left(std::auto_ptr<Node> node) { mLeft= node; }

  Node* right() const { return mRight.get(); }
  void right(std::auto_ptr<Node> node) { mRight = node; }

  data_type& data() { return mData; }
  const data_type& data() const { return mData; }

private:
  std::auto_ptr<Node> mLeft;
  std::auto_ptr<Node> mRight;
  data_type mData;
};

Nesne Odaklı varlık olarak, her Düğüm şimdi kolları bellekte sorumludur. Ayrıca kullanarak std::auto_ptrarayüzünde o sahipliğini alır açıklık getiriyor.

O derin kopyalama için özel oldu unutmayın, herhangi bir başka yaklaşım gerektiren boost::shared_ptrveya eşdeğeri. Ve evet std::auto_ptrorada, kendiniz kopyalama ile hiçbir sihirli uğraşan bırakır.

Bu tasarım, sade kullanarak daha temiz C-structherkes kaynaklarını işlemek için güçlü olmak ile. Hala erişimcisine yoluyla yatan verilere tam erişime sahip ... ama ONLAR tanımsız davranış çağırmak için özen ...

Tabii ki, yine de aşağı çökmesine sebep olabilir:

Node& node = ...
delete node.left(); // haha

C ++ istenmeyen sorunlar karşı koruyabilir Ama eğer kötülük koduna kapıyı açık bırakır.

Cevap 11/02/2010 saat 14:22
kaynak kullanıcı

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