2016-01-15 4 views
-2

Я студент колледжа, и в качестве моей последней задачи я должен создать словарь AVL Tree. Я пытаюсь написать это сам, мне удалось написать много всего, но у меня есть одна проблема. Когда я использую все свои получатели и сеттеры для случайных узлов или даже их вектор, он работает. Но когда я пытаюсь setRoot внутри метода Tree, он терпит неудачу. Я имею в виду, что он работает один раз, но как только я пытаюсь работать с root, вызывающим его с помощью avl.getRoot или как root в моей реализации, он терпит неудачу. Моя программа сбой. Это самая сложная программа, над которой я когда-либо работал. Не могли бы вы решить мою проблему и дать мне несколько советов о важных вещах? Заранее спасибо.C++ Указатели, ссылки и AVL Tree

main.cpp - Тесты

Node n1("clown",1); 
    Node n2("cat",1); 
    Node n3("kid",1); 
    Node n4("wasp",1); 
    n1.setLSon(&n2); 
    std::cout<<"ENG: "<<n1.getLSon().getWord().getEng()<<std::endl; 
    n1.setRSon(&n3); 
    std::cout<<"ENG: "<<n1.getRSon().getWord().getEng()<<std::endl; 
    n1.setParent(&n4); 
    std::cout<<"ENG: "<<n1.getParent().getWord().getEng()<<std::endl; 
    if(n2.hasLSon) 
    n2.getLSon(); 
    else 
    std::cout<<"n2 does not have a left son"<<std::endl; 
    AVL_Tree avl; 
    avl.addNode("cirrus",1); 
    avl.addNode("monkey",1); 
    std::cout<<"ENG: "<<avl.branches[0].getWord().getEng()<<std::endl; 
    std::cout<<"ENG: "<<avl.branches[1].getWord().getEng()<<std::endl; 
    avl.branches[0].setLSon(&avl.branches[1]); 
    std::cout<<"ENG: "<<avl.branches[0].getLSon().getWord().getEng()<<std::endl; 
    avl.branches[1].setParent(&avl.branches[0]); 
    std::cout<<"ENG: "<<avl.branches[1].getParent().getWord().getEng()<<std::endl; 
/*Error is being called here*/ 
    **std::cout<<"ROOT: "<<avl.getRoot().getWord().getEng()<<std::endl;** 
} 

дерева класс: Проблемный функции

AVL_Tree::AVL_Tree() 
{ 
    root=NULL; 
} 

void AVL_Tree::sort() 
{ 

} 

Node AVL_Tree::getRoot() 
{ 
    return *root; 
} 

void AVL_Tree::addNode(std::string eng,int count) 
{ 
    int i=0; 
    branches.push_back(Node(eng,count)); 
    for(i;i<branches.size();i++) 
    { 
     if(branches[i].getWord().getEng()==eng) 
     break; 
    } 
    if(branches.size()==1) 
    { 
    root=&(branches[i]); 
    std::cout<<"ROOT DODANY"<<endl; 
    std::cout<<root->getWord().getEng()<<std::endl; 
    } 
    else 
    std::cout<<"ROOTEM JEST: "<<root->getWord().getEng()<<std::endl; 
    if(!isBinary()); 
    sort(); 
} 

Tree Class

class AVL_Tree 
{ 
    public: 
           AVL_Tree(); 
      void    sort(); 
      void    addNode(std::string eng,int count); 
      void    deleteNode(std::string eng); 
      Node    findNode(std::string eng); 
      Node    getRoot(); 
      bool    isBinary(); 
      bool    isNode(std::string eng); 
      std::vector<Node> branches; 

    private: 
      Node    *root; 
      int     leftFactor; 
      int     rightFactor; 

}; 

node.cpp

Node::Node(std::string eng,int count):word(eng,count) 
{ 
    parent=NULL; 
    l_son=NULL; 
    r_son=NULL; 
    hasLSon=false; 
    hasRSon=false; 
} 

Node::~Node() 
{ 
    parent=NULL; 
    l_son=NULL; 
    r_son=NULL; 
} 

Word Node::getWord() 
{ 
    return word; 
} 

Node Node::getLSon() 
{ 
    return *l_son; 
} 

Node Node::getRSon() 
{ 
    return *r_son; 
} 

Node Node::getParent() 
{ 
    return *parent; 
} 

void Node::setLSon(Node *n) 
{ 
    l_son=n; 
    hasLSon=true; 
} 

void Node::setRSon(Node *n) 
{ 
    r_son=n; 
    hasRSon=true; 
} 

void Node::setParent(Node *n) 
{ 
    parent=n; 
} 

node.h

class Node 
{ 
    public: 
          Node(std::string eng,int count); 
          ~Node(); 
      Word   getWord(); 
      Node   getLSon(); 
      Node   getRSon(); 
      Node   getParent(); 
      void   setLSon(Node *node); 
      void   setRSon(Node *node); 
      void   setParent(Node *node); 
      bool   hasLSon; 
      bool   hasRSon; 
    private: 
      Node   *parent; 
      Node   *l_son; 
      Node   *r_son; 
      Word   word; 
}; 
+0

Этот код, похоже, не отражает того факта, что необходимо задействовать операции двоичного дерева. Вероятно, лучше сначала написать реализацию для двоичного дерева, а затем распространить ее на дерево AVL. –

+0

Я знаю, я читал об этом. Сначала я собираюсь написать его как BST, а затем использовать функцию для сортировки и создания AVL – Advent

+0

Двоичные (поисковые) деревья (деревья AVL, красно-черные деревья в виде особых случаев) не сортируются путем вызова функции sort() поскольку данные вставляются в три, так что упорядочение сохраняется в древовидной структуре. См. Https://en.wikipedia.org/wiki/Binary_search_tree#Operations –

ответ

0

В вашей addNode присвоить указатель на элемент branches к root. Позднее вызов addNode добавит новую ветвь, перераспределит память для вектора и аннулирует указатель root. Это приводит к более позднему сбою при попытке использовать этот недопустимый указатель.

У вас также есть точка с запятой после оператора if в конце addNode, что я не думаю, что вы хотите быть там. Скомпилируйте все предупреждения, чтобы они были уведомлены о таких вещах.

+0

Как я могу это сделать? Есть ли способ заставить его перераспределять указатель, когда root также перераспределяется? Разве я не должен использовать вектор узлов? Что еще ? – Advent

+0

@Advent Вы можете переназначить 'root' каждый раз, когда вы добавляете узел. – 1201ProgramAlarm

+0

Я думаю, у меня есть идея, как это исправить. Спасибо за ваш ответ. – Advent