2016-04-15 2 views
-1

Итак, у меня есть этот групповой проект, который должен взять текстовый файл, нарезать его на виды и подтипы и тому подобное. Я закончил измельчение и древовидную структуру, но мне нелегко заставить работать BuildGraph(). Я сузил его до функции findNode(), которая сейчас выглядит какПоиск узла в дереве узлов с произвольным числом детей

EDIT: комментарии, также это мой первый пост, так жаль, если это уродливо. У меня были оба эти изменения в другой версии, но они в конечном итоге избавились от них?

Node* findNode(std::string data, Node* head){ 
if (head == NULL){ 
    return NULL; 
} 
else if(head->data == data){ 
    return head; 
} else { 
    if(head->children[0]!=NULL){ 
     for(int i = 0; i<head->children.size();i++){ 
      return findNode(data, head->children.at(i)); 
     } 
    } 
} 

структура Мой узел выглядит следующим образом ...

public: 
    std::string data; 
    std::vector <Node*> children; 

    Node(std::string data){ 
     this->data=data; 
    } 

Я уверен, что проблема, которую я бегу в кое-что о рекурсивном вызове будет глубже, а не каким-то образом расширяется вызывая segfault.

Может ли кто-нибудь сказать мне, возможно ли, что я хочу сделать?

+1

'return findNode (data, head-> children.at (i));', вы пропустили 'return' –

+0

Почему бы не проверить, не является ли' head' непустым? –

ответ

1

У вас есть 2 проблемы:

if(head->children[0]!=NULL){ 

Вы получаете доступ к children[0], но вы не проверить, если дети пуст. Я уверен, что это вызывает ваш SegFault.

return findNode(data, head->children.at(i)); 

Необходимо проверить, является ли это null перед возвратом. Если это нулевое значение, вы хотите проверить других детей.

Также передайте const std::string& data, чтобы вы не копировали строку при каждом вызове.

Смежные вопросы