수다닷컴

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

이진트리인데요! 제발 알려주세요!

빛솔

2023.04.01

#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 main()
{
root = NULL;
UI();
}
void UI()
{
int insert_value, delete_value;
int num;
while(1)
{
printf(\n);
printf(삽입은 1, 삭제는 2를 입력하세요(처음입력값은 루트값이 됩니다) : );
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);
}
}
}
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);
}
}
void delete_f(int delete_value)
{
List *del_node; // 삭제될 노드
List *parent = NULL; // 삭제될 노드의 부모노드
del_node = root; // 탐색위치 초기화
List *right = root - R_link; // 삭제될 노드가 루트일때 오른쪽 삽입
List *left = root - L_link; // 삭제될 노드가 루트일때 왼쪽 삽입
while(del_node != NULL && delete_value != del_node - data)
{
parent = del_node;
if(del_node - data delete_value)
{
del_node = del_node - L_link;
}
else
{
del_node = del_node - R_link;
}
}
if(del_node == NULL)
{
printf(삭제하려는 값이 노드에 없습니다.\n);
UI();
}
else if(del_node - L_link == NULL && del_node - R_link == NULL)
{
if(del_node == root)
{
root = NULL;
}
else if(parent - data del_node - data)
{
parent - L_link = NULL;
}
else
{
parent - R_link = NULL;
}
}
else if(del_node - L_link == NULL || del_node - R_link == NULL)
{
if(del_node - data == root - data) // 삭제할 노드가 root일 경우
{
if(del_node - L_link != NULL)
{
parent = del_node - L_link;
}
else
{
parent = del_node - R_link;
}
root = parent;
}
else
{
if(del_node - data parent - data)
{
parent - L_link = NULL;
if(del_node - L_link != NULL)
{
parent - L_link = del_node - L_link;
}
else
{
parent - L_link = del_node - R_link;
}
}
else
{
parent - R_link = NULL;
if(del_node - L_link != NULL)
{
parent - R_link = del_node - L_link;
}
else
{
parent - R_link = del_node - R_link;
}
}
} // end else
} // else if(del_node - L_link == NULL || del_node - R_link == NULL)
else
{
List *p_searching = NULL; // 삭제된 노드의 부모노드
List *p_right = del_node - R_link; // 삭제된 노드가 가리키던 오른쪽 노드
List *p_left = del_node - L_link; // 삭제된 노드가 가리키던 왼쪽 노드
List *son = root - L_link; // 후계자 노드
while(son - R_link != NULL) // 후계자 노드 탐색
{
p_searching = son;
son = son - R_link;
}
if(p_searching == NULL)
ULL)
{
p_searching = del_node;
}
if(del_node - data == root - data) // 삭제하려는 노드가 루트일때
{
if(p_searching == NULL) // 루트에 자식노드가 왼쪽 오른쪽 두개 뿐일 때
{
p_searching = del_node - L_link;
p_searching - L_link = NULL;
p_searching - R_link = p_right;
root = p_searching;
}
else // 루트에 자식노드가 여러개일 때
{
root = son;
p_searching - R_link = NULL;
root - R_link = right;
root - L_link = left;
}
}
else
{
if(del_node - data parent - data)
{
parent - R_link = NULL;
parent - R_link = son;
p_searching - R_link = NULL;
son - R_link = p_right;
if(son == son - R_link)
{
son - R_link = NULL; // 후계자노드와 자식노드가 가리키는 오른쪽 노드의 값이 같을때
}
son - L_link = p_left;
}
else
{
parent - L_link = NULL;
parent - L_link = son;
p_searching - R_link = NULL;
son - R_link = p_right;
if(son == son - R_link)
{
son - R_link = NULL; // 후계자노드와 자식노드가 가리키는 오른쪽 노드의 값이 같을때
}
son - L_link = p_left;
}
}
} // end else
List *debug = root; // 디버깅용
free(del_node);
} // end void delete_f(int delete_value)

헉헉...;; 변수 사용을 잘못했는지 코드가 너무 길어졌네요.....;;
특히나 삭제함수부분에서 예외처리 하느라 너무 시간을 끌었네요...ㅠ.ㅠ
그리고 // 후계자노드와 자식노드가 가리키는 오른쪽 노드의 값이 같을때 -- 이 주석달린 부분은 없어도 될것 같은데
제 프로그램 상 어쩔수 없이 해야만 했네요.....예외처리 때문에....ㅠ.ㅠ
이거 좀 간단하게 짤수 없을까요?
재귀함수로도 이진트리를 구현할 수 있다는데 어떻게 해야 하나요?
혹시 아시는 분은 알고리즘이나 소스좀 보여주세요.
그리고 비단 이진트리가 아니더라도 이 소스보단 더 간략하게 줄일수 있을것 같은데
이 소스를 간단하게 줄일수 있는 것과 재귀함수로 구현한 이진트리에 대해 알고리즘이나 소스를
알려주시면 정말 감사하겠습니다.

신청하기





COMMENT

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

번호 제 목 글쓴이 날짜
2699547 [급]레이어보다 object태그가 우선순위가 되는 문제 (5) DevilsTears 2025-06-27
2699518 javaScript중복체크 하는법좀.. 알려주세요 (3) 비 2025-06-26
2699495 이런 탭메뉴를 뭐라고 해야 하는지 모르겠네요 (1) 들빛 2025-06-26
2699380 메뉴가 계단식으로 나타나요.. ㅠ.ㅠ (5) 스릉흔다 2025-06-25
2699354 영문 웹폰트 관련 질문입니다!!! (1) 치킨마루 2025-06-25
2699329 윈도우 미디어 플레이어 URL 질문!!! (1) 제철 2025-06-25
2699296 동영상 배경 질문드려요!!!!!!!!!!!!!! 핫파랑 2025-06-24
2699214 position:fixed 에 대한 질문입니다.. (7) 사이 2025-06-24
2699183 제이쿼리 이미지 슬라이드 위치값 수정 초엘 2025-06-23
2699153 테마[ADORABLE]에서 페이지생성시 하위페이지는 2개밖에 안되나요? 흰여울 2025-06-23
2699129 네이버 블로그 또는 사이트의 글을 불러오기 갤원 2025-06-23
2699070 탭메뉴처럼 셀렉트 박스를 이용해서 내용을 출력할 수 있는 방법이 있을까요. (3) 큰꽃늘 2025-06-22
2699016 인터넷이 안되는 환경에서 validator설치방법 (3) 은송이 2025-06-22
2698988 대체 C++ 6.0 exe 아이콘은 어떻게 넣는건가요? 외국녀 2025-06-22
2698960 음성파일을 embed로 작업했는데..웹 표준코딩으로 변경하려면 어떻게 해야하나요? (1) 잎새 2025-06-21
2698932 메뉴목록 풍선창 만들기 html (2) 하늘이 2025-06-21
2698901 http://www.zeitgeistbot.com/ 이 사이트처럼 움직이는 효과를 무엇이라고 하나요? 누림 2025-06-21
2698876 table width값 크로스브라우징에 대한 문의 (2) 볼수록매력 2025-06-21
2698849 c언어 질문. (3) 아름나 2025-06-20
2698823 setInterval 이벤트 제거 하려면... 가온길 2025-06-20
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

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