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ć.
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
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