2014-10-01 3 views
1

내 AVL 트리를 완전히 삭제하는 데 문제가 있습니다. 단일 노드를 삭제하는 방법을 알아 냈습니다. 그러나 내 destroyTree 함수는 실제로 모든 노드를 재귀 적으로 삭제하지는 않습니다. 나는 무엇을 잘못 할 수 있 었는가?전체 AVL 트리를 삭제합니다.

나는 구조체를 nodeType<myType>

template <class myType> 
struct nodeType { 
    myType keyValue; 
    int nodeHeight; 
    nodeType<myType> *left; 
    nodeType<myType> *right; 
}; 

을하고 난 기존의 모든 노드를 삭제하는 것을 시도하고있다 :

if(node != NULL) { 
    destroyTree(node->left); 
    destroyTree(node->right); 
    delete node; 
    } 
    node = NULL; 

을하지만이 제대로 높이를 검사 할 때, 노드를 삭제하지 않는 것 인쇄를 시도 할 때 크래시가 발생하기 전에도 여전히 높이가 나타납니다.

destroyTree(root); 
if(root == NULL) 
    std::cout << "destroyed" << std::endl; 

: 주요 기능은 트리를 파괴 호출 나는이 코드 조각을 (예 인쇄되지 않습니다)

template <class myType> 
void avlTree<myType>::destroyTree() 
{ 
    destroyTree(root); 
    if(root == NULL) 
    std::cout << "destroyed" << std::endl; 
} 

루트가 null가 아닌 것을 보여준다 if 문 간단한

+0

나에게 잘 보이는,하지만 난'노드 -> left'과'노드 -> right' NULL''을 삭제 한 후 설정하는 것이 좋습니다 것입니다. 노드가 삭제되지 않는다고 생각하는 이유는 무엇입니까? –

+0

이것은 방법입니까? 나는 C++을 기억하지 못한다. 그러나'self.destroyTree'와 같은 것을 말해야 만 하는가? –

+0

@JonathonReinhart 왜냐하면 제로가되어야하지만'destroyTree'를 호출 한 후 내 높이 함수를 호출하면 높이가 나옵니다. –

답변

3

봐 사용 아마도 destroyTree 함수의 프로토 타입은 다음과 같습니다.

void destroyTree(nodeType<myType> *node); 

문제는 노드 캔트 업데이트입니다. 호출자 메모리 주소가 아니라 호출자가 가리키는 내용 만. 이는 루트가 결코 업데이트되지 않을 것, 즉 그 내용이 NULL로 업데이트 될 수 없다는 것을 의미합니다.

는이를 위해, 당신은 같은 것입니다 프로토 타입이 필요합니다 당신이 참조에 의해 노드 을 복용하지 않는 것 같은데요

void destroyTree(nodeType<myType> **node); 
2

을, 당신은 NULL에 노드를 설정 때문에 때 실제로 노드의 로컬 복사본을 null로 설정합니다.

root이 값에 의해 촬영되어 있기 때문에 가 작동하지 않습니다 - 함수 호출 후 이전의 값이됩니다 root 참조에 의해 촬영되어 있기 때문에

template <class myType> 
void avlTree<myType>::destroyTree(nodeType<myType>* node) // note node taken by value here 
{ 
    if(node != NULL) { 
    destroyTree(node->left); 
    destroyTree(node->right); 
    delete node; 
    } 
    node = NULL; 
} 

이 작동 - 함수 호출 후 null이 될 것이다 :

template <class myType> 
void avlTree<myType>::destroyTree(nodeType<myType>* &node) // note node taken by reference here 
{ 
    if(node != NULL) { 
    destroyTree(node->left); 
    destroyTree(node->right); 
    delete node; 
    } 
    node = NULL; 
} 
관련 문제