2013-04-21 6 views
1

두 개의 이진 검색 트리가 같은지 테스트하는 코드를 작성했습니다.이진 검색 트리에서 이중 삭제 (?)

그러나 메모리를 할당 해제 할 때마다 액세스 위반 오류가 발생합니다. 그것을 살펴보면 메모리 할당 해제 기능에서 메모리 주소 0xfeefee에 액세스하고 있음을 알았습니다. Cell 소멸자 함수에서 액세스 위반이 발생합니다.

또한 실제로이 기능이 작동하는지 알 수는 없지만 실제로 도움을 요청하는 것은 아닙니다. 도움을받을 수는 있지만 여전히 도움이 될 것입니다.

할당 해제 기능 :

~Cell(void) { 
    if (left) { delete left; } 
    if (right) { delete right; } 
} 

기능 :

bool BST::isEqualTo(const BST& that) const{ 
    if(root <= 0 && that.root <= 0){ 
     return true; 
    }else if(root <= 0 || that.root <= 0){ 
     return false; 
    } 
    if(root->val != that.root->val){ 
     false; 
    } 
    /*Cell* saved_node1 = new Cell(*root); 
    Cell* saved_node2 = new Cell(*that.root);*/ 
    BST a, b, c, d; 
    a.root = root->left; 
    b.root = that.root->left; 
    c.root = root->right; 
    d.root = that.root->right; 
    if(a.isEqualTo(b) && c.isEqualTo(d)){ 
     /*a.root = saved_node1; 
     b.root = saved_node2; 
     c.root = saved_node1; 
     d.root = saved_node2;*/ 
     return true; 
    } 
    return false; 
} 

트리 소멸자 :

void BST::destroy(void) { 
    length = 0; 
    delete root; 
    root = nullptr; 
} 
+0

'BST :: root' 변수의 타입은'Cell *'입니다. 맞습니까? 또한'~ BST'를 보여주십시오. – soon

+0

예 루트는 Cell * 데이터 유형입니다. – kir

+0

@ user2280704 : BST 소멸자를 표시 할 수 있습니까? – Grzegorz

답변

1

그래서, 코드의이 부분에

BST a, b, c, d; 
a.root = root->left; 
b.root = that.root->left; 
c.root = root->right; 
d.root = that.root->right; 

BST 개체를 만들면 기능이 완료 되 자마자 소멸됩니다. 그리고 그 후에 모든 메모리는 root 포인터에 할당되어 해제됩니다.

bool _is_equal(Cell* c1, Cell* c2) 
{ 
    if(c1 == nullptr && c2 == nullptr) 
     return true; 
    else if(c1 == nullptr || c2 == nullptr) 
     return false; 

    return (c1 -> val == c2 -> val) && 
      _is_equal(c1 -> left, c2 -> left) && 
      _is_equal(c1 -> right, c2 -> right); 
} 

을 그리고 물론, 당신이 두 개체를 비교하는 operator==에 과부하를해야한다, 함수

bool BST::isEqualTo(const BST& that) const 
{ 
    return _is_equal(root, that.root); 
} 

에 전화 그리고 :

난 당신이 다른이 같은 기능을 비교 작성하는 것이 좋습니다. 그것은 더 예쁘게 보일 것입니다.

+0

알겠습니다. 그런 다음 루트 -> 왼쪽 및 루트 -> 오른쪽의 복사본 (새로 할당 된 메모리)을 만들어야합니까? – kir

+0

@ user2280704, 업데이트 된 답변을 참조하십시오. – soon

+0

@ user2280704 복사본을 만들지 마십시오. 비교에는 변동성이 전혀 필요하지 않으며 정직하게 BST가 필요하지 않습니다. 셀에서 아래로 비교하는 함수가 있습니다 (두 셀 및 일치하는 경우 각각 자녀). 그것을 이용하십시오. 임시 BST가 필요하지 않습니다. 위의 코드를 셀 비교기에서 보자. 두 개의 BST의 루트 셀 포인터에 대해서만 발사하십시오. (그리고이 대답에 +1, btw.) – WhozCraig