2017-09-22 6 views
-4

BST에서 리프의 삭제 기능을 만들었습니다. BST가 비어 있으면 BST가 비어 있음을 알립니다. 그렇지 않으면 몇 가지 사례가 있습니다. 그 중 하나는 노드 (잎)에 자식이 없다는 것입니다. 따라서 다른 노드와 더 이상 연결하지 않아도됩니다. 먼저 그 잎을 가리키는 포인터를 지운 다음 null.But을 가리키게합니다. 그러나 프로그램은 불행하게도 추락했습니다.이진 검색 트리에서 리프 삭제

여기
void BinarySearchTree :: delete_node(float deleted_key) 
{ 
    Node* deleted_node_address=return_node_address(deleted_key); 

    if(root == NULL) cout<<"The tree is empty, No thing to delete\n"; 

    else if(deleted_node_address->left_ptr==NULL && deleted_node_address->right_ptr==NULL) 
    { 
     cout<<"The element has no children, No linking required\n"; 
     delete deleted_node_address; 
     deleted_node_address=NULL; 
    } 
} 

return_node_address 함수이다 : 여기 함수이다

Node* BinarySearchTree ::return_node_address(float req_key,Node *traverse_ptr) 
{ 
    if(traverse_ptr==NULL) 
    { 
     cout<<"There is no data to return its addres"; 
     return 0; 
    } 
    else if(traverse_ptr->key == req_key) 
    { 
     return traverse_ptr; 
    } 
    else if(req_key < traverse_ptr->key && traverse_ptr->left_ptr != NULL) 
    { 
     return_node_address(req_key, traverse_ptr->left_ptr); 
    } 
    else if(req_key > traverse_ptr->key && traverse_ptr->right_ptr!= NULL) 
    { 
     return_node_address(req_key, traverse_ptr->right_ptr); 
    } 
    else 
    { 
     cout<<"The Key You Entred Is Not Found in The Tree"; 
     return 0; 
    } 

} 
+1

디버거로 프로그램을 실행하고 한 줄씩 단계별 실행을 시작할 시간입니다. – user0042

+0

QT를 사용하고 있습니다. 그 디버거가 작동하지 않습니다 !! – Ahmed

+2

그런 다음 작동 시키십시오. 보통 그렇습니다. – user0042

답변

1

deleted_node_address=NULL; 

deleted_node_address 변수를 클리어 할당은 BinarySearchTree :: delete_node(float deleted_key) 함수에 로컬이지만 이 아님 삭제 된 끄덕임에 대한 포인터 지우기 e를 부모 노드로부터 수신한다.

결과적으로 트리를 무효로 만들었습니다 : 일부는 left_ptr이거나 일부는 right_ptr이 NULL이 아니지만 비 오브젝트를 가리키고 있습니다. 따라서 다음에 시도 할 때 충돌이 발생하여 사용되지 않은 메모리에 액세스하려고합니다.

또한 을 테스트하기 전에 전에 을 삭제하기 위해 노드를 검색하는 기능을 호출합니다 (return_node_address()). return_node_address 방법이 NULL-root-proof ...입니까?

+0

당신은 그 부모로부터 삭제 된 노드를 가리키는 포인터가 null을 가리 키도록해야한다는 것을 의미합니까? 내가 맞습니까? – Ahmed

+0

@Ahmed 맞습니다. 하위 노드를 제거하면 해당 상위 노드에는 해당 하위 노드가 더 이상 존재하지 않습니다. 그리고 'left child'가 없거나 'right child가 없다'는 것은 정확하게'left_ptr' 또는'right_pttr'이'NULL'입니다. – CiaPan

+0

@Ahmed 아마도 BST에서 노드를 삭제하고 예제 구현을 연구하기 위해 google을 사용할 수 있습니다. 문제와 가능한 해결책에 익숙해지면 코드를 다시 찾아보고 누락 된 부분을 찾아보십시오. – CiaPan

관련 문제