문제

이를 통과 BST 및 삭제 모든 노드를 포함하여 루트 노드입니다.그러나 끝에,내가 메시지가"여전히 뿌리가 왼쪽 노드입니다." 왜 모든 노드 삭제됩니까?

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;
}   
도움이 되었습니까?

해결책

당신은 삭제 중입니다 p 끝에 (root) 그런 다음 내용에 액세스하려고합니다 deleteTree(), 어디 root 더 이상 할당 된 메모리를 가리키지 않습니다. 결과는 정의되지 않을 것입니다.

다른 팁

당신은 삭제하고 있습니다 root. 그런 다음 코드가 메모리에 액세스하려고합니다.

당신은 그곳에서 정의되지 않은 고지대에 잘 들어갑니다.

당신은 부정을 피해서는 안됩니다 root 삭제 한 후에 deleteNode. 디버거를 사용하여 이유를 검사하십시오 root->left 널이 아닙니다.

당신은보고 있습니다 root->left 루트를 이미 삭제 한 후에는 새 할당 된 블록에서 사용할 수 있습니다.

나는 단순히 우리 자체가,그것은 쉽게 될 것 그것을 다루는 다음:

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;
};

는 객체-지향,각 노드에 대한 책임 메모리 처리합니다.또한,사용 std::auto_ptr 인터페이스에서 분명히 그것은 소유입니다.

참고 그에 맞는 대한 깊은 복사,다른 접근 방식이 필요한 boost::shared_ptr 또 동일합니다.네 std::auto_ptr 잎 다운로 복사해 자신이 없는 마술이 있다.

이 설계는 많은 청소기용 일반 C-struct 모두가 함께할 수 있는 조작하는 자원입니다.당신은 아직 전체에 액세스하는 기초 데이터를 통해 accessor...하지만 그들이 돌보지 않는 호출하는 정의되지 않은 행동...

물론 당신은 여전히 충돌 그것:

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

그러나는 경우 C++에 대해 보호할 수 있습니다 원하지 않는 문제,나의 문을 열어 악 코드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top