2012-11-22 2 views
2

나는 일반적인 이진 트리 (찾기가 아닌)에 대해 "찾기"와 "삭제"기능을 만들고있다. 다음은 찾기 기능 코드입니다.바이너리 트리에서 노드를 삭제하고 찾는다.

bool Find_Node(FileItem * item, Node *current) //function starts with root 
{ 
    if (current->getNameItem() == item->getName()) //getNameItem() retrieves the data name in node. 
    { 
     currentItem = current; //I have set currentItem as an attribute (pointer to a Node) in the tree class. I created it to point to the node I want to find. 
     return true; 
    } 
    Node* child [2]; 

    child[0] = current->getLeft(); 
    child[1] = current->getRight(); 

    bool res = false; 

    for (int i = 0; res == false && i < 2 ; i++) 
    { 
     if(child[i] != NULL) 
      res = Find_Node(item, child[i]); 
    } 
    return res; 
} 

노드를 찾는 더 좋은 방법이 있습니까? 누군가가 나를 삭제 기능으로 도와주세요.

답변

2

NULL에 대한 기본 사례를 추가하여 논리를 단순하게 만듭니다.

bool Find_Node(FileItem * item, Node *current) 
{ 
    if(current == NULL) return false; 
    if (current->getNameItem() == item->getName()) { 
     currentItem = current; 
     return true; 
    } 
    return Find_Node(current->getLeft()) || Find_Node(current->getRight()); 
} 

void Delete_Node(Node*& current) 
{ 
    if(current == NULL) return; 
    Delete_Node(current->getRight()); 
    Delete_Node(current->getLeft()); 
    delete current; 
    current = NULL; 
} 

내가 어떻게 나무가 이것은 유래의 원인이 정말 큰 경우

을해야하는 swap 기능을 구현하는 방법을 말할 수있는 노드의 구현을 참조 할 수 있습니다. 그러나 솔루션을 재귀 적 솔루션에서 반복적 솔루션으로 변경하면이 문제를 해결할 수 있습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 삭제 기능은 어떻습니까? –

+0

@MohamadOmarHindi 잠깐 혼란 스러웠습니다. 나는 그 질문과 그 명백한 것을 지금 다시 읽었다. 'Node' 클래스의 구현을 바꿀 수 있습니까? 스왑 메소드를 추가하면 정말로 삭제에 도움이됩니다. – andre

+0

예. 할 수 있습니다. 미안 나는 충분히 설명하지 않았다; 삭제하고자하는 I 노드에 하위 노드가있는 경우 삭제해야하므로 스왑이 필요 없습니다. –