재귀함수에서 햇갈리는게 있어서 질문드립니다.
회전력
#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을 만나니깐 함수가끝난뒤 왜 이전 단계로 다시 올라가는지...;;;;;;;;;;;;;;;;
그렇게 다 순회를 한후 올라갈 값이 완전히 없어야 함수를 끝내더군요.....;;;
??????????한 부분을 중심으로 정말 이해가 안됩니다 ㅠ.ㅠ
-
갈매빛 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 |
