Я уже немного работаю над этим проектом и сталкиваюсь с этой проблемой, которую не могу решить.
В качестве предисловия программа создает двоичное дерево из данных изфайл, то дерево может расти, и новая полная информация записывается поверх этого исходного файла.
Чтобы сделать все это с одним информационным вектором, мой входной вектор должен быть упорядочен в порядке уровней, однако (насколько я понимаю, пожалуйста, исправьте меня, если я ошибаюсь), чтобыДля этого мне нужно, чтобы в моем векторе учитывались пустые пространства NULL, и чтобы все правильно переписать, мне нужны узлы faux-NULL (узлы, которые заполняют пространство, но не содержат никакой фактической информации, кроме указателей) в моем дереве.
Когда дерево растет, я пытаюсь завершить его и сбалансировать его с "NULL" узлами, и я делаю это рекурсивно с обходом в порядке и глубиной в памяти.Однако, когда я запускаю это, я получаю ошибку сегментации, и когда я запускаю ее шаг за шагом с помощью отладчика, я получаю
Cannot open file: ../../../../../src/gcc-4.9.2/libgcc/unwind-sjlj.c
специально.Это происходит, когда во время рекурсивного обхода алгоритм добавляет узел, и при достижении «возвратной» части распределителя памяти узла появляется ошибка, и программа прерывается.
Это ошибка с моимкод или это ошибка библиотек Code :: Blocks?
Соответствующий код:
struct Node
{
int idx; //idx is information relevant to the program but not to the structure
std::string phrase;
Node* left, * right;
};
Node* newNode(std::string data, int idx) //memory allocator
{
Node* node = new Node;
node->phrase = data;
node->idx = idx;
node->left = node->right = NULL;
return (node); //right here is where the debugger gives me the error
}
// Function to insert nodes in level order
Node* insertLevelOrder(std::string arr[], int idx[], Node* root,int i, int n)
{
// Base case for recursion
if (i < n)
{
Node* temp = newNode(arr[i],idx[i]);
root = temp;
// insert left child
root->left = insertLevelOrder(arr,idx,root->left, 2 * i + 1, n);
// insert right child
root->right = insertLevelOrder(arr,idx,root->right, 2 * i + 2, n);
}
return root;
}
int calcularProfundidad(Node * root) //Sorry for the spanglish--this is "calculateDepth"
{
if (root == NULL)
{
return 0;
}
int h1 = calcularProfundidad(root->left); //recursively calculate depth of left subtree
int h2 = calcularProfundidad(root->right); //and of right subtree
return 1 + max(h1,h2);
}
void rellenarNulos(Node * root, int prof, int counter) //fills "empty spaces" with "faux-NULL" nodes
{
if(counter == prof) //if reaches depth, stops, if not, adds more nodes
return;
if(root->left == NULL && counter < prof)
{
Node * auxNode = newNode("NULL",0); //error in this call
root->left = auxNode;
}
if(root->right == NULL && counter < prof)
{
Node * auxNode2 = newNode("NULL",0);
root->right = auxNode2;
}
rellenarNulos(root->left,prof,counter++);
rellenarNulos(root->right,prof,counter++);
}
#include <iostream>
#include <fstream>
#include <string>
#include "arbLib.hpp"
using namespace std;
int main()
{
//Builds tree from file
int N;
fstream myfile ("test.txt");
if (!myfile.is_open())
{
cout << "Unable to open file" << endl;
return 0;
}
myfile >> N; //N is the number of nodes
string words[N];
for(int i=0;i<N;i++)
myfile >> words[i];
int nums[N];
for(int j=0;j<N;j++)
myfile >> nums[j];
myfile.close();
//Builds tree from these vectors that are level order
Node *root = insertLevelOrder(words,nums,root,0,N);
int prof = calcularProfundidad(root); //calculates depth
rellenarNulos(root,prof,1); //here is where the program dies
inOrder(root);
destroyTree(root);
cout << endl;
return 0;
}