2011-03-13 9 views
0

내 바이너리 트리의 항목이 잘못 삽입되는 문제가 있습니다. 각 노드에 문자열을 삽입하고 있습니다. 나는 틀린 나무로 항상 끝내는 것처럼 보이기 때문에 내가 뭔가 잘못하고 있다고 생각합니다. 즉이진 검색 트리. 삽입 방법이 잘못 삽입되었습니다.

A, B, C

나는

B 
/\ 
A C 

을해야하지만, 어떻게 든 내가 좋아하는 끝낼 :

C 
/\ 
B A 

또는 뭔가 다른 내가에 삽입되는 순서에 따라 내 나무.

이 내 나무 클래스 :

이 내 삽입 방법이고 도우미 메서드를 삽입합니다. 너는 내가 뭘 잘못하고 있는지 한번 볼 수 있니? 미리 감사드립니다.

당신이 periviusly 삽입 된 것을 변경하지 않을 경우 렸기 때문에의
void BinarySortTree::insert(string key) 
{ 
    if(root != NULL) 
    { 
     insert(key, root); 
    } 
    else 
    { 
     root = new TreeNode; 
     root->item = key; 
     root->left = NULL; 
     root->right = NULL; 
    } 
} 

void BinarySortTree::insert(string key, TreeNode *node) 
{ 
    bool done = false; 

    while(!done) 
    { 
     if(key.compare(node->item) < 0) 
     { 
      if(node->left != NULL) 
      { 
       node = node->left; 
      } 
      else 
      { 
       node->left = new TreeNode; 
       node->left->item = key; 
       node->left->left = NULL; 
       node->left->right = NULL; 
       done = true; 
      } 
     } 
     else if(key.compare(node->item) > 0) 
     { 
      if(node->right != NULL) 
      { 
       node = node->right; 
      } 
      else 
      { 
       node->right = new TreeNode; 
       node->right->item = key; 
       node->right->left = NULL; 
       node->right->right = NULL; 
       done = true; 
      } 
     } 
     else if(key.compare(node->item) == 0) 
     { 
      done = true; 
     } 
    } 

} 
+0

귀하의 알고리즘은 재귀 적이 지 않습니다. 질문 태그를 수정하십시오. 삽입이 진행되는 방식과 방법을 다시 읽으라고 조언합니다. –

+2

@ Mr.TAMER : 위의 * 구현 *은 확실히 재귀가 아닙니다. * 알고리즘 자체에 관해서는 그렇게 단순하지 않습니다. 알고리즘 적 재귀의 넓은 정의에 따라 공식적으로 재귀 적으로 호출 될 수 있습니다. 사실, 알고리즘 관점에서 볼 때, 어떤 사이클은 퇴보의 퇴화 된 형태로 해석 될 수 있습니다. – AnT

+0

@ 안드레이 T : 고마워, 몰랐어 ... 수업이 배웠어. –

답변

2

는, 예를 들어, 당신은 당신이 "C"를 삽입 그래서 만약 루트에서 일어날 수없는 절대 (예 : B에 대한)를 삽입 먼저 다음 항목에서 C를 삽입 할 경우, "B"는 "A"의 순서로 당신이 나무 모양의 것 :

C 
/
    B 
/
A 

당신은 현재 노드를 변경해야하는 경우 모든 검사해야! 그리고 삽입 할 때마다 루트가 바뀔 수도 있습니다. 그리고 당신이 그리는 나무는 주어진 입력에 대해서만 코드가 생성하는 나무의 유일한 형태를 생성하지 않습니다 :

ABC  ACB  BAC  CBA  CAB 
        BCA   
A   A   B   C  C    
    \   \  /\  / /  
    B   C  A C  B  A    
    \  /    /  \ 
    C  B     A   B 
+1

자기 균형 조정 이진 탐색 트리를 설명하고 있습니다. 그는 균형 잡히지 않고 간단한 이진 검색 트리를 구현하려고 시도하는 것 같습니다.이 트리는 설명대로 최악의 경우 선형 목록으로 변합니다. – Antti

+0

균형을 이루려면 어떻게해야합니까? 나는 추가 할 필요가있다. 삭제할 필요가 없다. – Tony

+0

균형 이진 트리의 경우 예 : [red-black tree] (http://en.wikipedia.org/wiki/Red-black_tree) 또는 [AVL 트리] (http://en.wikipedia.org/wiki/AVL_tree)를 참조하십시오. 그것들을 구현하는 것은 다소 까다 롭습니다. 그리고 아마 원래의 문제를 해결하기를 원할 것입니다. – Antti