У меня возникла проблема с деревом AVL, разработанным в C++ для моего класса. Учитель указал, что мы НЕ МОЖЕМ использовать struct {}, поэтому нам необходимо создать класс Node и класс Tree или, в конечном итоге, уникальный класс.AVL Tree - невозможно передать корень методу вставки
Проблема заключается в передаче указателя корневого узла из основной в функцию вставки, что позволяет нам вставлять новые строки в наше дерево двоичных исследований.
Вот код, который мы написали до сих пор (это на нашем языке, в основном Nodo = Node и Albero = Tree). Заранее спасибо за любую помощь, вы можете дать нам:
#include <iostream>
#include <string>
using namespace std;
/* -------- CLASSE: NODO -------- */
class Nodo {
public:
string vocabolo;
Nodo* left;
Nodo* right;
Nodo();
~Nodo() { }; // Distruttore inline
};
// Costruttore di Nodo
Nodo::Nodo() {
left = right = NULL;
}
/* -------- CLASSE: ALBERO BINARIO DI RICERCA BILANCIATO -------- */
class Albero {
/*
private:
Nodo* root;
*/
public:
int height(Nodo* nodo);
int heightDifference(Nodo *nodo);
void inorder(Nodo *radice);
Nodo* balance(Nodo* nodo);
Nodo* ll_rotate(Nodo* padre);
Nodo* lr_rotate(Nodo* padre);
Nodo* rl_rotate(Nodo* padre);
Nodo* rr_rotate(Nodo* padre);
Nodo* insert(Nodo* nodo, string nuovoVocabolo);
Nodo* returnRoot();
Albero();
~Albero() { }; // Distruttore inline
};
// Costruttore di Albero
Albero::Albero() {
// root = NULL;
}
/*
Nodo* Albero::returnRoot() {
return root;
} */
int Albero::height(Nodo* nodo) {
int altezza = 0; // Imposto altezza iniziale a zero. Rimarrà così se passo puntatore a root.
if (nodo != NULL) {
int l_height = height(nodo->left);
int r_height = height(nodo->right);
int max_height = max(l_height, r_height);
altezza = max_height + 1;
}
return altezza;
}
int Albero::heightDifference(Nodo* nodo) {
int l_height = height(nodo->left);
int r_height = height(nodo->right);
int b_factor = l_height - r_height;
return b_factor;
}
Nodo* Albero::ll_rotate(Nodo* padre) {
Nodo* temp;
temp = padre->left;
padre->left = temp->right;
temp->right = padre;
return temp;
}
Nodo* Albero::rr_rotate(Nodo* padre) {
Nodo* temp;
temp = padre->right;
padre->right = temp->left;
temp->left = padre;
return temp;
}
Nodo* Albero::lr_rotate(Nodo *padre) {
Nodo *temp;
temp = padre->left;
padre->left = rr_rotate(temp);
return ll_rotate(padre);
}
Nodo* Albero::rl_rotate(Nodo *padre) {
Nodo *temp;
temp = padre->right;
padre->right = ll_rotate(temp);
return rr_rotate(padre);
}
Nodo* Albero::balance(Nodo* nodo) {
int b_factor = heightDifference(nodo);
if (b_factor > 1) {
if (heightDifference(nodo->left) > 0) {
nodo = ll_rotate(nodo);
} else {
nodo = lr_rotate(nodo);
}
} else if (b_factor < -1) {
if (heightDifference(nodo->right) > 0) {
nodo = rl_rotate(nodo);
} else {
nodo = rr_rotate(nodo);
}
}
return nodo;
}
Nodo* Albero::insert(Nodo *nodo, string nuovoVocabolo) {
if (nodo == NULL) {
nodo = new Nodo;
nodo->vocabolo = nuovoVocabolo;
} else if (nuovoVocabolo < nodo->vocabolo) {
nodo->left = insert(nodo->left, nuovoVocabolo);
nodo = balance(nodo);
} else if (nuovoVocabolo >= nodo->vocabolo) {
nodo->right = insert(nodo->right, nuovoVocabolo);
nodo = balance(nodo);
}
return nodo;
}
void Albero::inorder(Nodo* radice) {
if (radice == NULL) return;
inorder(radice->left);
cout << radice->vocabolo << " ";
inorder(radice->right);
}
/* -------- FUNZIONE MAIN -------- */
int main(int argc, const char * argv[])
{
Albero tree;
tree.insert(root, "ciao");
tree.insert(root, "pino");
tree.insert(root, "mauro");
tree.insert(root, "francesco");
tree.inorder(root);
return 0;
}
Вы забыли объявить корень, то есть одна проблема (ее закомментировать). – leparlon
Не смотрите на комментарии, они являются результатом некоторых тестов, которые я сделал. Подумайте, что комментариев нет – wiredmark
@Wired, отредактируйте комментарии. Отправьте точный код, который вы хотите просмотреть. Все остальное - огромная трата времени. – StoryTeller