왜 C++코드 실패 모든 노드를 삭제 내 BST?
-
19-09-2019 - |
문제
이를 통과 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++에 대해 보호할 수 있습니다 원하지 않는 문제,나의 문을 열어 악 코드입니다.