• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

DeleteAllNodes 에서 질문있습니다.

20.09.23 20:12 작성 조회수 144

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등 다른 기능을 수행시에도  문제없이 작동합니다.