apwgg045   6년 전

코드 작동 방식

0. 노드를 50개 저장하는 배열을 입력받고, 루트노드의 주소값을 root에 저장하며, 각 노드에 자식이 생길 때마다 nOfChild값을 1씩 증가시킴

1. 제거하려는 노드의 부모 노드로 접근하여 nOfChild를 1 빼고, 부모 노드 포인터를 NULL로 설정

(루트 노드를 제거한 경우는 if문으로 따로 처리)

2. 노드가 저장되어 있는 배열을 돌면서 nOfChild 값으로 리프 노드를 확인

3. while문을 통해 부모 노드가 없는 노드(루트노드)까지 올라가서, root와 주소값을 비교함으로써 제거된 노드의 리프노드들을 걸러낼 수 있음(2에 의해)


생각할 수 있는 예외도 전부 처리했고 결과도 맞게 나오는데 오답처리가 되는 이유를 모르겠습니다.

djm03178   6년 전

3

-1 0 1

2

이 경우 1이 출력되어야 합니다.

apwgg045   6년 전

djm03178// 1 출력 아주 잘 됩니다...

djm03178   6년 전

https://doyak.s-ul.eu/bu9J9h2k

그러면 어딘가 보장할 수 없는 동작을 하는 곳이 있을 것으로 보이네요. 한 번 찾아보죠.

djm03178   6년 전

그거겠네요.

tree[parentNode].nOfChildren++;

tree가 지역변수이기 때문에, nOfChildren이 초기화가 안 되어있죠.

디버깅 해보면 이상한 값이 들어가는 걸 볼 수 있습니다.

https://doyak.s-ul.eu/QJWfbDpB

djm03178   6년 전

메모리에 0 값은 흔하기 때문에 사용하는 환경이나 경우에 따라서는 일관성 있게 다 0으로 초기화된 것처럼 보일 수도 있지만, 표준상에서는 0으로 초기화해준다는 보장이 없습니다. 초기화가 안 되어 있다고 보고 진행하셔야 합니다.

apwgg045   6년 전

djm03178//

초기화가 문제였군요. 감사합니다 덕분에 배워갑니다!

댓글을 작성하려면 로그인해야 합니다.