2016-10-31 2 views
-1

내 BST에서 노드를 제거하는 데 문제가 있고 내 seg 결함에 범인을 찾을 수없는 것 같습니다. BST의 다른 모든 부분은 테스트를 거쳤으며 원활하게 실행됩니다. 다른 조건의 노드를 삭제하려고 시도했지만 모두 동일한 결과가 발생합니다. 제거 기능의 각 행이진 검색 트리 (BST)에서 노드를 삭제하면 오류가 발생합니다.

delete current_node_; 

template <typename object> 
bool BST<object>::remove(object& data) 
{ 
    if (nodes == 0) 
    { 
     return false; 
    } 
    else 
    { 
     return remove(root_, data); 
    } 
} 



template <typename object> 
bool BST<object>::remove(node<object>* current_node_, object& data) 
{ 
    if (current_node_ == NULL) 
    { 
     return false; 
    } 

    int relation = compare(data, current_node_->get_data()); 

    //if you need to keep searching right 
    if (relation > 0) 
    { 
     remove(current_node_->get_right(), data); 
    } 
    else if (relation < 0) 
    { 
     remove(current_node_->get_left(), data); 
    } 
    else 
    { 
     //LEAF CASE 
     if (current_node_->is_leaf()) 
     { 
      //root case 
      if (compare(root_->get_data(), data) == 0) 
      { 
       root_ = NULL; 
      } 

      else 
      { 
       if (current_node_->is_right_child()) 
       { 
        current_node_->get_parent()->set_right(NULL); 
       } 
       else 
       { 
        current_node_->get_parent()->set_left(NULL); 
       } 
      } 

      //release from memory 
      delete current_node_; 
      nodes--; 
     } 
     //ONE CHILD CASE 
     else if (current_node_->has_one_child()) 
     { 
      //root node 
      if (compare(root_->get_data(), data) == 0) 
      { 
       if (current_node_->get_right() != NULL) 
       { 
        current_node_->get_right()->set_parent(NULL); 
        root_ = current_node_->get_right(); 
       } 
       else 
       { 
        current_node_->get_left()->set_parent(NULL); 
        root_ = current_node_->get_left(); 
       } 
      } 

      //node with right child 
      else if(current_node_->get_right() != NULL) 
      { 
       current_node_->get_right()->set_parent(current_node_->get_parent()); 
       if (current_node_->is_right_child()) 
       { 
        current_node_->get_parent()->set_right(current_node_->get_right()); 
       } 
       else 
       { 
        current_node_->get_parent()->set_left(current_node_->get_right()); 
       } 
      } 
      //node with left child 
      else 
      { 
       current_node_->get_left()->set_parent(current_node_->get_parent()); 
       if (current_node_->is_right_child()) 
       { 
        current_node_->get_parent()->set_right(current_node_->get_left()); 
       } 
       else 
       { 
        current_node_->get_parent()->set_left(current_node_->get_left()); 
       } 
      } 

      //release from memory 
      delete current_node_; 
      nodes--; 
     } 
     //TWO CHILDREN CASE 
     else 
     { 
      node<object>* temp_node_ = find_min(current_node_->get_right()); 
      object* temp_object_ = new object(temp_node_->get_data()); 

      remove(temp_node_, temp_node_->get_data()); 
      current_node_->set_data(*temp_object_); 
     } 
     return true; 
    } 
    return false; 
} 

template <typename object> 
node<object>* BST<object>::find_min(node<object>* current_node_) 
{ 
    if(current_node_->get_left() != NULL) 
    { 
     find_min(current_node_->get_left()); 
    } 
    else 
    { 
     return current_node_; 
    } 
} 
+2

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+1

당신은'remove' 함수를 재귀 적으로 호출하지만 재귀 호출이 리턴하는 것을 리턴하지 않습니다. –

답변

2

쓰기

current_node_=NULL; 

. 그 일이 있다면 알려주지.

+0

didn; t 일하지만 지금은, 너의 도움을 위해 그것을 가지고있어! – Koobz866