inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어 (부록)

17.17 이진 탐색 트리 구현하기 ​

DeleteAllNodes 에서 질문있습니다.

374

TaeChoon Park

작성한 질문수 57

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;

 }

이렇게 구현하는것이 더 좋지않나 싶은데 선생님은 어떻게 생각하시나요?

c

답변 5

1

홍정모

수정하신 대로 하셔도 큰 문제는 없습니다만 곧 지워질 노드에 굳이 NULL을 대입하는 낭비가 발생합니다.

부분적으로 지웠다가 생성했다 하는 트리에서는 꼬박꼬박 NULL을 대입해주는 것이 좋겠지요.

모두 삭제하는 경우에는 DeleteAllNodes(...)를 호출한 곳에서 root = NULL로 바꿔주는 것이 가장 간결합니다.

이 이상은 본 강의의 범위를 벗어나겠네요. 실무에서는 상황에 따라 선택해서 구현하시면 됩니다.

1

홍정모

강의용 코드라서 실무에 완벽하게 대응하지는 못할겁니다만 에러를 발생시키는 '실제 활용'이 어떤 경우인지 궁금하네요. 

0

TaeChoon Park

많은 도움 되었습니다! 

0

TaeChoon Park

아 그리고 이왕 교수님이 답변해주셨으니 여쭈는데 , 일전에 조사하셨던 그래픽스 강의는 어느정도 진행이 됬는지 알 수 있을까요? 

0

TaeChoon Park

안녕하세요. 교수님이 직접 답변해주시는건 오랜만이네요 . 

아래는 DeleteAllItems 를 따로 구현않고 , DeleteAllNodes 만을 이용한 코드입니다. 

삭제하는행위는 정상적으로 되더라도 , Tree의 root가 NULL로 변경되지 않았기에 PrintTree를 하게되면 비어버린 객체에 접근하게 되어 비정상적인 결과가 발생하는것을 볼 수 있습니다. 

아래는 DeleteAllItems 를 사용한 코드로 , Tree 의 root 와 m_items 를 0으로 초기화하여 print Tree등 다른 기능을 수행시에도  문제없이 작동합니다.

26년 1회 실기 해설 강의

0

32

2

주소 연산자(&) 간접 지정자(*) 반대 개념

0

22

1

53번 4-1 자료 오류 있는 것 같습니다.

0

60

2

7번문제

0

48

2

C언어 변형문제 9번문제 Pdf 수정요청

0

38

2

메서드 오버드라드

0

40

2

이진 탐색: 탐색 실패하는 경우 어째서 first > last인 경우가 나오나요?

0

324

1

17.12) access violation

0

307

1

finditembyindex 질문드립니다!

0

348

1

19:20 부분에서 질문있습니다.

0

278

1

pnode = pnode->next; 와 pnode->next = pnode;는 같은 것으로 생각해도 될까요?

0

401

2

질문. warning뜨는 이유

0

300

1

링크드 리스트 질문 드립니다.

0

216

1

함수포인터 질문드립니다

0

224

1

강의 내용 질문 드립니다!

0

369

2

노드 주소 순서 관련 질문

0

282

1

질문드립니다!

0

242

1

16:30 질문입니다.

0

343

4

scanf 질문이요!!

0

253

1

12:30 의 ArrayQueue.h

0

292

2

10:10 Add front에서 질문드립니다.

1

362

1

스택 자료구조

0

246

1

변수 count의 활용에 대해 질문이 있습니다.

0

319

1

1번 실행하면 에러가 뜨는데 이유를 모르겠습니다..

0

370

2