2011-11-29 11 views
5

Jest to część laboratorium szkolnego zajmującego się rekurencją i drzewem binarnym. Jeśli pójdę wstawić 4 lub 5 liczb i wyprowadzę wynik, otrzymam 3 numery z powrotem. Oto kod do wkładki:Wstawianie 4 lub 5 liczb w drzewie binarnym, ale uzyskanie tylko 3 liczb na wyjściu

Node *insert(Node *t, int key) { 
    Node *insertParent; 
    Node *result=NULL; 

    if (t!=NULL) { 
     result=search(t,key,insertParent); 
    } else { 
     t=new Node; 
     t->data=key; 
     t->leftchild=NULL; 
     t->rightchild=NULL; 
     return t; 
    } 

    if (result==NULL) { 
     if (insertParent->data>key) { 
      insertParent->leftchild=new Node; 
      insertParent->leftchild->data=key; 
      insertParent->leftchild->leftchild=NULL; 
      insertParent->leftchild->rightchild=NULL; 
      return insertParent->leftchild; 
     } else if (insertParent->data<key) { 
      insertParent->rightchild=new Node; 
      insertParent->rightchild->data=key; 
      insertParent->rightchild->leftchild=NULL; 
      insertParent->rightchild->rightchild=NULL; 
      return insertParent->rightchild; 
     } 
    } else 
     return NULL; 
} 

Ale wierzę, że problem jest w funkcję wyszukiwania, a konkretnie wskaźnik węzeł odnośnikiem rodzica:

Node* search(Node *t, int key, Node *&parent) { 
    if (t!=NULL) { 
     parent=t; 
     if (t->data==key) 
      return t; 
     else if (t->data>key) 
      return search(t->leftchild,key,t); 
     else 
      return search(t->rightchild,key,t); 
    } else 
     return NULL; 
} 

Mam funkcję, która wyprowadza drzewo i mieć Sprawdziłem to na drzewie, które zbudowałem ręcznie i działa dobrze:

void inorder(Node *t) 
{ 
    if (t!=NULL) { 
     if (t->leftchild!=NULL) 
      inorder(t->leftchild); 

     cout << t->data << ", "; 

     if (t->rightchild!=NULL) 
      inorder(t->rightchild);      
    } 
} 

Nie szukam odpowiedzi, szukając tylko obszaru, który powinienem obejrzeć.

Odpowiedz

0

Odkryłem, że mój problem dotyczy funkcji wyszukiwania. Miało to związek z referencyjną zmienną węzła nadrzędnego. Musiałem użyć instrukcji four else/ifelse, aby móc zdecydować, którą drogę wybrać, rekurencyjnie lub nie.

Node* search(Node *t, int key, Node *&parent) { 
    if (t!=NULL) { 
     if (t->data==key) { 
      parent=NULL; 
      return t; 
     } else if (t->data>key && t->leftchild!=NULL) { 
      return search(t->leftchild,key,parent); // think this needs returned 
     } else if (t->data>key && t->leftchild==NULL) { 
      parent=t; 
      return NULL; 
     } else if (t->data<key && t->rightchild!=NULL) { 
      return search(t->rightchild,key,parent); //think this needs returned 
     } else if (t->data<key && t->rightchild==NULL) { 
      parent=t; 
      return NULL; 
     } 
    } else { 
     parent=NULL; 
     return NULL; 
    } 
} 

Ta zmiana funkcji wyszukiwania konieczność zmiany funkcji insert:

Node *insert(Node *t, int key) { 
    Node *insertParent=NULL; 
    Node *result=NULL; 

    if (t!=NULL) { 
     result=search(t,key,insertParent); 
    } else { 
     t=new Node; 
     t->data=key; 
     t->leftchild=NULL; 
     t->rightchild=NULL; 
     return t; 
    } 

    if (insertParent==NULL && result!=NULL) { 
     return NULL; 
    } else if (insertParent!=NULL && result==NULL) { 
     //key not found need to add 
     if (insertParent->data>key) { 
      insertParent->leftchild=new Node; 
      insertParent->leftchild->data=key; 
      insertParent->leftchild->leftchild=NULL; 
      insertParent->leftchild->rightchild=NULL; 
      return insertParent->leftchild; 
     } else { 
      insertParent->rightchild=new Node; 
      insertParent->rightchild->data=key; 
      insertParent->rightchild->leftchild=NULL; 
      insertParent->rightchild->rightchild=NULL; 
      return insertParent->rightchild; 
     } 
    } 
} 

Dziękujemy wszystkim, którzy pomogli ...

(także: I odpowiedział na moje własne pytanie. Czy to, co powinienem zrobić, czy powinienem edytować mój wpis? Pomyślę, że ludzie woleliby zobaczyć cały proces i nie kazali mi usunąć starego niedziałającego kodu ...)

+0

Powinieneś edytować oryginalne pytanie, aby pytanie było jaśniejsze, ale odpowiedź powinna być tym, co otrzyma znacznik wyboru. Jeśli masz zamiar odpowiedzieć na własne pytanie, pomyśl nie tylko o "tutaj jest działający kod", ale tak jakbyś był kimś, kto próbuje się uczyć, czytając dyskusję. Jako, że jesteś nowy, zrobiłem kilka edycji, aby pomóc w przedstawieniu pomysłów w porównaniu do oryginału: http://stackoverflow.com/revisions/8306096/1 – HostileFork

+0

Zaktualizowałem twoją odpowiedź, aby pokazać, o czym mówię. Zauważ, że jeśli zamierzasz udostępnić funkcję drukowania "zamówienia", możesz równie dobrze umieścić ją w pytaniu, ponieważ nie była to "nowa" rzecz nabyta w trakcie udzielania odpowiedzi ... dlatego przeniosłem ją do pytanie. Możesz zobaczyć, o ile łatwiej jest to zrobić, gdy przeplatasz krótkie próbki kodu z tekstem opisowym zamiast wklejać długie, przewijane okno kodu. Również StackOverflow jest podobna do Wikipedii i zapisuje historię zmian w Q & A, więc rzeczy nie gubią się: http://stackoverflow.com/revisions/8317919/1 – HostileFork

3

Twoje podejrzenie jest prawidłowe. Śledzenie, jak parametr "nadrzędny" najwyższego poziomu jest aktualizowany po przeszukaniu więcej niż jednego węzła.

0
Node* search(Node *t, int key, Node *&parent) 
{ 
    if(t!=NULL) 
    { 
    parent=t; 
    if (t->data==key) 
     return t; 

    else if (t->data>key) 
     return search(t->leftchild, key, parent); // use “parent” because you want to assign parent to this variable 

    else 
     return search(t->rightchild,key, parent); 
    } 
    else  return NULL; 

} 
+1

"Nie szukam odpowiedzi, szukając tylko obszaru, który powinienem obejrzeć". - Dobra robota nie odpowiada. – AShelly

+0

@AShelly nadal Nie wiesz gdzie jest problem? chcesz przypisać "insertParent" do punktu wstawienia. dobrze? więc powinieneś go śledzić podczas rekurencyjnego wyszukiwania binarnego, w przeciwnym razie masz zły wskaźnik rodzica. obszar, na który powinieneś spojrzeć, to "odniesienie" C++. – jianyi

+0

Umieszczenie rodzica na t nie rozwiązuje problemu. –