본문 바로가기
PROGRAMING📚/자료구조📑

이진트리와 재귀함수 사용

별찌루 2019. 2. 13.
728x90
반응형

 이진트리와 재귀함수를 사용해서



이런식으로

동물이름과 특징을 받아서

맞으면 처음으로 돌아가고, 틀리면 그 동물이름과 특징을 받아서 다시 물어보는

프로그램을 짜는 것입니다.


그리고 a를 눌렀을때 출력까지!




일단 Question이라는 구조체를 만들어줍니다.

반복적으로 동물의 이름과 특징, 그리고 이중트리를 만들기위해

맞으면 nYes로 아니면 nNo를 가르키는 포인터를 생성해줘야합니다.

그리고 루트(머리)를 가르키는 곳을 표시해줘야합니다.

->Question* head;


일단 메인으로 가서



문자를 입력 받기 위해서 배열을 만들어줍니다.

그다음에 계속 반복하기위해서 while문을 만들어줘야 루프가 계속 돌아가겠죠?


일단은 처음에 헤드를 고정하기위해서

head가 NULL일때를 만들어줍니다.

처음시작할때는 아무것도 없으니 동물이름과 특징을 받아주고

head를 새로운 구조체로 만들어주고

구조체에 맞게 넣어주면 됩니다.

처음 head를 만들때에는 다른 입력 받은 값이 없음으로 pNo,pYes는 NULL로 만들어 줘야해요


헤드가 있을때는 head를 가지고 질문을 계속 하는 식의 루프를 만들어야겠죠?

여기서 재귀함수가 등장합니다.



메인 else 부분의 Quest구현 부분입니다.

질문을 받기 위한 anser배열과 동물의 특징과 이름을 받기위해 각자의 배열을 생성해줬어요


46번 째 줄은 현재 pNode는 head이기 때문에 head->desc과 같은 의미에요

특징에 목이길어라고 넣었을때  목이길어? 라는 부분을 출력하기 위해 만들었어요 .

.c_str()은 문자열을 출력하기 위해서 사용하는 것이에요 . 이게 없으면 포인터와 스트링을 이용해서만 구현이 가능해요

48번째 줄에서 목이길어라는 특징에 대한 질문을 받고 y면 head의 이름인지 확인!

이런식으로! 해주면되요


yes일때 보다는 NO일때가 가장 복잡해요

no일때 pNode의 왼쪽이 NULL일경우

질문을 다시 받아와요



그리고 새로운 데이터(구조체)를  만들어줍니다

nNode의 왼쪽에 새로운 데이터를 넣어주고

새로운 데이터안에 이름과 특징을 넣어주고 , 그 새로운 데이터의 pYes와 pNO에  NULL을 넣어줍니다.


이미 데이터가 들어가 있으면?

다시 Quest를 불러와서 pNode의 자리에 pNode->pYes(=newData)를 넣어주면서

다시 불러오면! 완료!


99번째 줄은 출력을 하기위한 문입니다

a 를 입력하면 입력받은 데이터들의 값이 출력되도록!

마지막에 적을께요 



일단 아까 위의 if문은 head->pYes의 값이였다면

지금 사진은 head->pNo의 부분을 구현하는 부분입니다.

코드는 head->pYes와 유사해요


인제 출력 부분을 볼께요




출력하기 위해서 함수를 사용했어요

코드를 그대로 해석 하자면


24-28번째 까지의 코드는

pNode->pYes를 가르키면 들어가서

다시 한번더 print함수를 불러오는 재귀방식을 사용하고 있어요

*한마디로 이중트리의 왼쪽부분이 NULL이 될때까지 들어가고 NULL이 되면

다음 코드로 넘어가서 이름과 특징을 출력하고 나오는 거죠


왼쪽부분을 다 출력하고 나오면 오른쪽부분을 출력하게 되는

방법으로 출력됩니다.




이렇게 구현을 모두 마쳤어요.






728x90
반응형

댓글