수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

재귀함수에서 햇갈리는게 있어서 질문드립니다.

회전력

2026.01.19

#includestdio.h
#includestdlib.h
typedef struct List
{
int data;
struct List *L_link;
struct List *R_link;
}List;
List *root;
void UI();
void insert_f(int insert_value);
//void delete_f(int delete_value);
void pre_print(List *root); // 전위순회
void in_print(List *root); // 중위순회
void post_print(List *root); // 후위순회
void main()
{
root = NULL;
UI();
}
void UI()
{
int insert_value, delete_value;
int num;
while(1)
{
printf(\n);
printf(삽입1, 삭제2, 전위순회3, 중위순회4, 후위순회5 입력(처음입력값은 루트값) : );
scanf(%d, &num);
if(num == 1)
{
printf(삽입할 값을 입력하세요 : );
scanf(%d, &insert_value);
insert_f(insert_value);
}
/*if(num == 2)
{
printf(삭제할 값을 입력하세요 : );
scanf(%d, &delete_value);
delete_f(delete_value);
}*/
if(num == 3)
{
pre_print(root);
}
if(num == 4)
{
in_print(root);
}
if(num == 5)
{
post_print(root);
}
}
}
void pre_print(List *root)
{
if(root)
{
printf(%d - , root - data);
pre_print(root - L_link);
pre_print(root - R_link);
}
}
void in_print(List *root)
{
if(root)
{
in_print(root - L_link);
printf(%d - , root - data);
in_print(root - R_link);
}
}
void post_print(List *root)
{
if(root)
{
post_print(root - L_link);
post_print(root - R_link);
printf(%d - , root - data);
}
}
void insert_f(int insert_value)
{
List *search; // 탐색노드
List *parents; // 삽입될 노드의 부모노드
List *insert_node; // 삽입될 노드
search = root; // 탐색위치 초기화
while(search != NULL)
{
parents = search;
if(search - data insert_value)
{
search = search - L_link;
}
else if(search - data insert_value)
{
search = search - R_link;
}
else
{
break;
}
}
insert_node = (List *)malloc(sizeof(List));
insert_node - data = insert_value;
if(root == NULL)
{
root = insert_node;
insert_node - L_link = NULL;
insert_node - R_link = NULL;
}
else if(parents - data insert_node - data)
{
parents - L_link = insert_node;
insert_node - L_link = NULL;
insert_node - R_link = NULL;
}
else if(parents - data insert_node - data)
{
parents - R_link = insert_node;
insert_node - L_link = NULL;
insert_node - R_link = NULL;
}
else
{
printf(입력하신 값이 존재합니다.\n);
free(insert_node);
}
}
가령 제가 이진트리에다가 값을 100-80-120-70-90-110-130 이렇게 삽입했습니다.
그리고 전위수식으로 출력했다고 치면 재귀함수로 출력하는데 재귀함수가 자기자신을 호출한다는건 이해가 됩니다.
그런데 null을 만난 이후에 함수가 위로 올라가더군요?
즉 70이 가리키는 L_link가 null을 만나면 L_link함수가 끝나는데
다음번에 또 호출할때 70으로 올라갔다가????????
올라간 70이 다시 R_link로 가보고
70이 가리키는 R_link도 널이되니깐
80으로 올라가더군요???????????????????
그리고 나서 80이 가리키는 R_link로 가더군요
그리고 나서 80이 가리키는 R_link에 90이 있으니까 이 90을 출력했다가
90이 가리키는 L_link로 가더군요????????
그리고 L_link가 null이 되니깐
다시 90으로 올라가고...........
그 90이 다시 R_link를 가리키고.........
R_link가 null이 되니깐 80으로 올라갔다가......
다시 100으로 올라가더군요???????????????
그리고 이번엔 100이 가리키는 R_link로 가보고.........
120을 출력한후 위에 쓴 부분이 반복되더군요......
이거 어떤 원리로 함수가 null을 만나게 되면 다시 그전 단계로 올라가는 건가요?
이것 때문에 햇갈리네요.......
위로 올라가는 것 때문에요.......
그리고 R_link함수에서 예를 들면 아까 90에서 다시 L_link로 간후 null이니깐
90으로 올라갔다가 다시 R_link를 가리키고 이것도 null이 되니깐
80으로 올라가는???????
이 원리를 좀 설명해 주시면 정말 감사하겠습니다.
아무리 책을 읽고 디버깅을 해봐도 잘 이해가 안되네요...
밑으로 타고 내려오는건 이해가 되는데 null을 만나니깐 함수가끝난뒤 왜 이전 단계로 다시 올라가는지...;;;;;;;;;;;;;;;;
그렇게 다 순회를 한후 올라갈 값이 완전히 없어야 함수를 끝내더군요.....;;;
??????????한 부분을 중심으로 정말 이해가 안됩니다 ㅠ.ㅠ

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 갈매빛 2026-01-19

    감사합니다.

  • 잔디 2026-01-19

    만일 main()에서 a() 라는 호출하고 a()에서 b()를 호출했을때 b()루틴이 모두 끝나면 어디로 갈까요?
    a()로 갑니다, 여기서 또 a()가 종료하면? 예, main()으로 흘러가겠죠
    main() - a() - b() - b()종료후 - a() - a()종료후 - main()

    재귀로 여러번 호출했다고 같은 함수라고 생각해서는 안됩니다
    각각 다른 메모리영역을 가지고 있는 함수이고 각 루틴에서 표현하려하는 노드는 다르겠죠

번호 제 목 글쓴이 날짜
2752024 소숫점 뺄셈 !! ㅠㅜ 초롬 2026-10-20
2751970 자바 게임 만들려는데 부탁드립니다 (1) 라온제나 2026-10-19
2751908 자바스크립트 처리속도를 체크할 수 있는 방법 있나요? (1) 테이 2026-10-19
2751822 그누보드 아이프레임으로 구현했는데 제목 클릭해서 들어가면 푸터가 동동...떠다녀요 내꺼하자 2026-10-18
2751790 자바 그래픽 관련을 공부하고 싶은데요.. 어디 좋은 사이트나 책 없을까요?? (1) 큰재 2026-10-18
2751733 CTF가머죠? (5) 두동 2026-10-17
2751709 배열부분 궁금한 부분이있습니다. 딸기우유 2026-10-17
2751677 포인터 책을 보다가,,, (2) 동백 2026-10-17
2751648 익스플로 버전에 따라서 생기는 공백.. (1) 모아 2026-10-17
2751623 DEL 태그의에서 선굵기 및 컬러지정이 가능한가 해서요~ (4) 비치나 2026-10-16
2751573 테마 업로드 에러.. (1) 꽃 2026-10-16
2751548 수학? 물리?? (3) 찬늘 2026-10-16
2751461 상단네비 fixed ie6 핵 해결방안이 있을까요? 맑다 2026-10-15
2751436 레이아웃을 잡고 코딩을 하는데 드림위버에서의 결과와 IE에서 결과가 다르게 나오네요. (3) 키클 2026-10-15
2751403 형들좀도와주세요string compression (1) 알렉산더 2026-10-14
2751349 링크 다운로드하기 팬지 2026-10-14
2751295 c++한번도 손않댄 사람이... 날위해 2026-10-13
2751267 플래시8 사용에서 플레이어 만들었는데요 (1) 블1랙캣 2026-10-13
2751182 회원가입 파랑새 2026-10-12
2751152 소셜 플러그인 문제입니다. 얀 2026-10-12
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com