2013-10-24 8 views
1

이진 트리 함수에서 제거를 쓰려고합니다. 나는 잃어 버렸어 그래서 제거하려고하는 값이 BST의 루트에있는 경우로 시작하여 케이스별로 처리하려고합니다. 내 함수를 테스트하기 위해 먼저 트리의 모든 내용을 인쇄하는 printcontents() 함수를 호출하고 나서 remove (8) [8은 현재 루트에있는 값임)를 호출 한 다음 printcontents () 다시. 내가하고있는 방식은 루트를 트리의 왼쪽에있는 "가장 오른쪽"값으로 바꾸는 것입니다. 두 번째로 printcontents를 호출하면 새로운 루트 값을 올바르게 인쇄하지만 내용을 계속 인쇄하고 그 값이 있던 지점에 도달하면 임의의 긴 숫자 "-572 ......"가됩니다. (비록 그 숫자가 중요하지 않다고 생각 하긴하지만) 내 프로그램이 충돌한다. 내 뿌리의 가치가 대체되고있는 것을 볼 수 있지만 나중에 어떻게 될까요 ?? 그것은 분명히 불완전이진 트리에서 제거

void BinarySearchTree::remove(int value) { 

     Node* tmp = head; 
     Node* tmp2 = head; 


    if (head->data == value && head->left != NULL) { 

     tmp=tmp->left; 

     while (tmp->right != NULL) { 
      tmp=tmp->right; 

     } 

     while (tmp2->right->right != NULL) { 
      tmp2=tmp2->right; 

     } 

     if (tmp->left == NULL) {  

     head->data = tmp->data; 
     tmp2->right = NULL; 
     delete tmp; 

     } 

     if (tmp->left != NULL) { 

      head->data = tmp->data; 
      tmp2->right = tmp->left; 
      delete tmp; 

     } 




} 

,하지만 난 단지 루트를 제거하고 왼쪽에서 가장 오른쪽에있는 값으로 대체되는 경우를 처리로 테스트 해요 :

여기 내 제거 기능입니다 나무 (거기에있는 왼쪽면이 있다고 가정), 그리고 논리적으로 그것이 작동해야하므로, 아마도 내가 "tmp 삭제"일이 잘못 될 것 같은 느낌. 내 전체 프로그램 게시가 필요한지 여부는 모르지만 그렇다면 알려주세요.

+0

너무 심하게 무시당했습니다. – FrostyStraw

답변

1

루트 용으로 작성하는 대신 CLRS에서 처리 할 때 대소 문자를 사용하지 않는 것이 좋습니다. 두 가지 경우가 있습니다. 1. 삭제할 노드가 리프 일 때 2. 삭제할 노드가 리프가 아닌 경우 (이 경우에는 inorder successor/predecessor로 바꿉니다).

루트 삭제는 분명히 두 번째 경우에 해당합니다. 이것은 단지 제안 일뿐입니다.