2014-01-16 4 views
0

У меня возникла проблема с деревом 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; 
} 
+0

Вы забыли объявить корень, то есть одна проблема (ее закомментировать). – leparlon

+0

Не смотрите на комментарии, они являются результатом некоторых тестов, которые я сделал. Подумайте, что комментариев нет – wiredmark

+1

@Wired, отредактируйте комментарии. Отправьте точный код, который вы хотите просмотреть. Все остальное - огромная трата времени. – StoryTeller

ответ

1

Причину Я считаю, у вас есть проблемы, проходящих указатель корневого узла из основной функции вставки происходит потому, что указатель корня является частным членом вашего класса Albero , Частный член класса может быть доступен только другим членам класса (Albero). ссылка для получения более подробной информации: http://www.tutorialspoint.com/cplusplus/cpp_data_encapsulation.htm

Что вы можете сделать, чтобы исправить проблему, это создать еще одну функцию, которая вызовет вашу функцию вставки.

void Albero::insertStart(string nuovoVocabolo) 
{ 
    insert(root,nuovoVocabolo); 
} 

Теперь вы можете просто сделать несколько вызовов insertStart()

int main(int argc, const char * argv[]) 
{ 
    Albero tree; 
    tree.insertStart("ciao"); 
    tree.insertStart("pino"); 
    tree.insertStart("mauro"); 
    tree.insertStart("francesco"); 
    tree.inorder(root);  //you can apply a similar solution to this function 
    return 0; 
}