Решено - Проблема с конструктором
Мэтью Флашен и Майкл Барр указал на проблему перегруженного конструктора Node(int)
, вызывающего Node()
, который не работает , потому что ...
Спасибо, ребята!
Я создал программу (я отлаживаю ее) и столкнулся со странной проблемой ... Оператор `if` не запускается, когда это должно быть ... Это школьный проект, в котором мы должны создать Дерево AVL с хотя бы одной «оптимизирующей» функцией.
Я уверен и проверил, что `rdown` и` ldown` работают (как факторы балансировки) - дерево не идеально сбалансировано. Скорее он основан на высоте ветвей (то есть - «balance ()» должен возвращать только (1,0, -1), в противном случае он не сбалансирован.
Надеюсь, этого достаточно, чтобы решить эту странную проблему ... Я никогда не сталкивался с чем-то подобным в Microsoft Visual Studio 2010.
Структура узла:
struct Node {
int data; // the data in the Node
int rdown; // the number of ellements below the node on the right side
int ldown; // the number of ellements below the node on the left side
Node * parrent; // the node's parrent
Node * lchild; // the nodes left child
Node * rchild; // the nodes right child
Node () { rdown = 0, ldown = 0; data = 0; parrent = NULL; lchild = NULL; rchild = NULL; }
Node (int dat) {rdown = 0, ldown = 0; parrent = NULL; lchild = NULL; rchild = NULL; data = dat; }
bool end() { if (lchild == NULL && rchild == NULL) return true; // check if this node is the 'end of the line' - where it doesn't
return false; } // have any children
bool goodToAdd() { if (lchild == NULL || rchild == NULL) return true; // make sture the current node has at least one spot to add
return false; } // a new node to - either lchild or rchild must be NULL
int balance() { return (ldown - rdown); } // get a balance number for the node
};
Функция поиска, вызывающая проблемы
Node * AVL_Tree::search(const Node * num) {
Node * tmpNode = AVL_Tree::root; // tmpNode is a place holder for the search
for (int i = 1; true; i++) { // increment int i to check for excess searching -> pervents endless loop
if (tmpNode == NULL) //****** causing problems******** // the search has reached a dead end (the data is not contained) ==> NULL
return NULL;
if (tmpNode->data == num->data) // if the data of num is the same as tmpNode the data is contained ==> Node *
return tmpNode;
// since the node has not been found yet move down the tree...
if (tmpNode->data > num->data && tmpNode->lchild != NULL) // if the data is smaller than the tmpNode move to the lchild
tmpNode = tmpNode->lchild;
else if (tmpNode->rchild != NULL) // since the node has been proven to not be = to the data to be searched for
tmpNode = tmpNode->rchild; // and it is not smaller... move to the right
if (i > (root->ldown + 1) && i > (root->rdown + 1) ) { // the while loop has searched suffecent time and has not ended
string tmp = "the search incountered a critical error... aborting..."; // to prevent an endless loop the string error
throw tmp; // is thrown (should not happen) - indicates a broken tree
}
}
}
Скриншот первого столкновения с for loop
Снимок экрана второй встречи с for loop
Если вы заметили на вкладке «Авто» внизу, что все данные и адрес самого узла - NULL
- все же на следующем снимке экрана это продолжается
Программа продолжается !!! что?>!
Я нажал F-10 (кнопка «перейти к следующей команде») ... и она перепрыгнула прямо через оператор? Зачем?