Page 421 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 421

1. 삭제할 노드의 왼쪽 서브 트리에서 키 값이 가장 큰 노드를 검색합니다.
                         2. 검색한 노드를 삭제 위치로 옮깁니다(검색한 노드의 데이터를 삭제 대상 노드 위치로 복사합니다).
                         3.   옮긴 노드를 삭제합니다. 이때
                           •    옮긴 노드에 자식이 없으면
                             ‘자식 노드가 없는 노드의 삭제 순서’에 따라 노드를 삭제합니다.
                           •    옮긴 노드에 자식이 1개만 있으면
                             ‘자식 노드가 1개 있는 노드의 삭제 순서’에 따라 노드를 삭제합니다.



                        Remove 함수는 앞에서 배운 세 가지 상태에서 노드를 삭제하는 방법을 구현한 함수입니다.


                         실습 10-2[D]                                              •완성 파일 chap10/BinTree.c
                         01  /*--- 노드 삭제 ---*/
                         02  int Remove (BinNode **root, const Member *x)
                         03  {
                         04    BinNode *next *temp;
                         05    BinNode **left;
                         06    BinNode **p = root;
                         07
                         08    while(1) {
                         09      int cond;
                         10      if(*p == NULL) {
                         11        printf("【오류】 %d는 등록되어 있지 않습니다.\n", x->no);
                         12        return –1;          /* 이 키는 없습니다. */
                         13      } else if((cond = MemberNocmp(x, &(*p)->data)) == 0)
                         14        break;             /* 검색 성공 */
                         15      else if(cond < 0)
                         16        p = &((*p)->left);   /* 왼쪽 서브 트리에서 검색 */
                         17      else
                         18        p = &((*p)->right);   /* 오른쪽 서브 트리에서 검색 */
                         19    }
                         20
                         21    if((*p)->left == NULL)
                         22      next = (*p)->right;
                         23    else {
                         24      left = &((*p)->left);
                         25      while((*left)->right != NULL)
                         26        left = &(*left)->right;
                         27      next = *left;
                         28      *left = (*left)->left;
                         29      next->left = (*p)->left;
                         30      next->right = (*p)->right;


                                                                                          10•트리  421
   416   417   418   419   420   421   422   423   424   425   426