2013-07-27 2 views
0

Другая проблема с рекурсией, извините, просто не могу опустить голову. Я пытаюсь вернуть указатель узла, чей идентификатор соответствует указанному идентификатору. Кажется, я правильно обхожу дерево. Любые идеи, в которых я ошибаюсь?Возврат значения из рекурсивной функции

//h 
Node* findNode(const QString &id, Node *node=NULL) 

//cpp 
Node* Tree::findNode(const QString &id, Node *node) 
{ 
    if (node == NULL) 
     node = root; 

    for(int i = 0, end = node ? node->childCount() : -1; i < end ; i++) 
    { 
     QString nodeId = node->child(i)->id(); 

     if (nodeId == id) 
     { 
      return node; 
     } 
     else 
     { 
      return findNode(id, node->child(i)); 
     } 
    } 
} 

Спасибо для смотреть

ответ

3

Я уверен, что вам нужно что-то вроде:

... 
else 
{ 
    Node *temp = findNode(id, node->child(i)); 
    if (temp) return temp; 
} 

Как это, это возвращение, прежде чем он достигнет конца своего цикла.

Кроме того, вам нужно вернуть NULL (или еще лучше, nullptr) в конце вашей функции:

// At the end 
return NULL; 
+0

Спасибо всем. Маты, в предложении else идентификатор узла не соответствует желаемому идентификатору, поэтому зачем мне возвращать узел? – dogsbollocks

+0

'return temp;' заключается в замене 'return findNode (...)' - это означает, что вы нашли то, что ищете в дочернем узле. Очевидно, что если 'temp' является NULL, вам нужно продолжать искать. В вашем исходном коде вы всегда возвращались в этот момент, поэтому вы никогда не смотрели на все узлы определенного уровня, что явно неверно. Но вы не хотите продолжать искать, если вы что-то нашли, поэтому вернитесь, если у вас есть. –

4

В else только возвращает значение из рекурсивного вызова, если что-то было. В противном случае, вы никогда не будете пройти i=0

1
else return findNode(id, node->child(i));` 

это приведет к обходу первого поддерева (ребенок) только ,

Я бы предпочел написать что-то вроде этого, чтобы пройти все поддеревьями на заказ, пока что-то не найдено. Если ничего не найдено, вернуть nullptr:

Node *find(Node *tree, string id) 
{ 
    if (tree->id == id) 
     return tree; 

    Node *ptr = nullptr; 
    for (int i = 0; i < tree->childCount; i++) 
     if ((ptr = find(node->children[i], id)) != nullptr) 
      return ptr; 

    return nullptr; 
} 
0

Вы, кажется, делают только по глубине первого поиска, и возвращает результат крайнего левого листа узла.

В findNode (id, node-> child (i)); вы никогда не проверяете, возвращает ли это NULL.

Вернитесь только оттуда, если возвращаемое значение от ребенка не является NULL (вы действительно что-то нашли), в противном случае продолжайте в цикле (прямо сейчас вы смотрите только на первый элемент).

Затем, после цикла, если ничего не найдено (возврат не возвращен), возвращайте NULL.

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