BST продолжают получать ошибку сегментации

голоса
3

EDIT: запустить его через GDB дает

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400e4c in Tree::findKey(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, Tree::Node*) ()

Нужна помощь с моим первым кодом BST, я получаю ошибку сегментации, я думаю, что это утечка памяти? если это так я не знаю, где / как исправить здесь коды, которые я думаю, вызывают проблемы. Это потому, что я не имею конструктор копирования создать еще ??

tree.cpp файл

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

bool Tree::insert(int k, string s)
{
  return insert(root, k, s);
}
//HELPER Call find data with key function
bool Tree::findKey(string& s, int k)
{
    return findKey(s, k, root);
}
bool Tree::insert(Node*& currentRoot, int k, string s)
{
  if(currentRoot == NULL){
    currentRoot = new Node;
    currentRoot->key = k;
    currentRoot->data = s;
    currentRoot->left = NULL;
    currentRoot->right = NULL;
    return true;
  }
  else if (currentRoot->key == k)
    return false;
  else if (currentRoot->key > k)
    return insert(currentRoot->left, k, s);
  else
    return insert (currentRoot->right,k, s);
}
bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if (currentRoot->key == k){
        s = root->data;
        return true;
    }
    else if (root->key < k)
        return findKey (s, k, root->right);
    else if (root->key > k)
        return findKey (s, k, root->left);
    else
        return false;
}

main.cpp

int main()
{
string sout;
  Tree test;
    test.insert(1, a);
    test.insert(2, b);
    test.insert(3, c);
    test.findKey(sout, 3);
    cout<<sout<<endl;
  return 0;
}
Задан 27/04/2011 в 14:09
источник пользователем
На других языках...                            


2 ответов

голоса
2

Я вижу некоторые возможные Segfault Когда N я смотрю на ваш метод. Просто подумайте о случаях края.

Что здесь происходит?:

Tree test; 
test.findKey(sout, 3);

или

Tree test;
test.insert(1, "a");
test.findKey(sout, 3);

Устранить эти случаи и дальше.

Ответил 27/04/2011 в 14:19
источник пользователем

голоса
2

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if (currentRoot->key == k){
        s = root->data;
        return true;
    }
    else if (root->key < k)
        return findKey (s, k, root->right);
    else if (root->key > k)
        return findKey (s, k, root->left);
    else
        return false;
}

Вы всегда используете rootвместо currentRoot, так что вы на самом деле не спускаться вниз по дереву и получите StackOverflow в какой - то момент. Кроме того , вы пропустили проверить , если currentRootIS NULL, потому что если вы к нему доступ , то вы получите хороший Segfault (это то , что имел в виду @tgmath).

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if(currentRoot == NULL)
        return false;
    // as before ...
}
Ответил 27/04/2011 в 14:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more