작성
·
248
0
안녕하세요 .
교수님의 DeleteAllNodes 코드는 아래와같습니다.
void DeleteAllNodes(Node*root){
if (root == NULL) { return; }
Node* pright = root->right;
DeleteAllNodes(root->left);
free(root);
DeleteAllNodes(pright);
}
하지만 이 코드는 Tree의 root 를 NULL로 바꿔주지못해 실제 활용시 에러를 발생시키는데요 따라서
Node**ptr 을 Parameter로 사용하거나 Tree를 활용해야하는데 재귀호출을 사용하다보니 Node**ptr을 Parameter로 받기는 조금 번거롭고
따라서 Tree를 활용하기위해 아래와같이
DeleteAllItems 라는 함수를 따로만들어
void DeleteAllNodes(Node*root) {
/*
if (root == NULL) { return; }
Node* pright = root->right;
DeleteAllNodes(root->left);
free(root);
DeleteAllNodes(pright);
*/
if (root == NULL) { return; }
Node* pright = root->right;
if (root->left != NULL) { DeleteAllNodes(root->left); }
free(root);
if (root->left != NULL) { DeleteAllNodes(pright); }
}
void DeleteAllItems(Tree* tree) {
if (tree->root == NULL) { return; }
DeleteAllNodes(tree->root);
tree->root = NULL;
tree->m_items = 0;
}
이렇게 구현하는것이 더 좋지않나 싶은데 선생님은 어떻게 생각하시나요?
답변 5
1
수정하신 대로 하셔도 큰 문제는 없습니다만 곧 지워질 노드에 굳이 NULL을 대입하는 낭비가 발생합니다.
부분적으로 지웠다가 생성했다 하는 트리에서는 꼬박꼬박 NULL을 대입해주는 것이 좋겠지요.
모두 삭제하는 경우에는 DeleteAllNodes(...)를 호출한 곳에서 root = NULL로 바꿔주는 것이 가장 간결합니다.
이 이상은 본 강의의 범위를 벗어나겠네요. 실무에서는 상황에 따라 선택해서 구현하시면 됩니다.
1
0
0
0
안녕하세요. 교수님이 직접 답변해주시는건 오랜만이네요 .
아래는 DeleteAllItems 를 따로 구현않고 , DeleteAllNodes 만을 이용한 코드입니다.
삭제하는행위는 정상적으로 되더라도 , Tree의 root가 NULL로 변경되지 않았기에 PrintTree를 하게되면 비어버린 객체에 접근하게 되어 비정상적인 결과가 발생하는것을 볼 수 있습니다.
아래는 DeleteAllItems 를 사용한 코드로 , Tree 의 root 와 m_items 를 0으로 초기화하여 print Tree등 다른 기능을 수행시에도 문제없이 작동합니다.