Найти элемент в n-арном дереве

Учитывая следующую структуру

struct nNode {
   int val;
   struct nNode parent;
   struct nNode children;
   struct nNode next;
   struct nNode prev;

};

Где children указывает на первого ребенка и перейти к другим детям, которым мы должны следовать node->children->next...

Я пытаюсь вернуть указатель на элемент, который содержит некоторые val используя функцию

struct nNode* nNode_find(struct nNode *node, int val)
{
  // We found the node return the pointer
  if(node->val == val) return node;
  // We didn't found let's check the children
  struct nNode *child = node->children;
  while(child) {
    nNode_find(child, val);
    child = child->children;
    // We didn't found on child, lets check his brothers
    struct nNode *sibling = child->next;
    while(sibling) {
      nNode_find(sibling, val);
      sibling = sibling->next;
    }
  }
  // We didn't found the element return NULL
  return NULL;
}

Учитывая дерево колле TREE лайк:

  /*                      1
   *            /---------|--------\
   *          2           3         4
   *        /   \                 /
   *      5       6              7
   */

Команда как

struct nNode *ptr = nNode_find(TREE, 3);

должен вернуть указатель на root->children->next, но с фактическим nNode_find возвращается NULL,

1 ответ

Решение

Проблема в том, что вы игнорируете возвращаемое значение из рекурсивного nNode_find, Если возвращаемое значение не NULL, вы должны вернуть его сразу. Так что вместо

nNode_find(child, val);

делать

struct nNode* found = nNode_find(child, val);
if (found) {
    return found;
}

Также каждый nNode_find вызов должен обрабатывать только один узел, а не передаваться потомкам потомков или тому подобное; Вы хотели бы сделать несколько отладочных отпечатков, чтобы убедиться, что каждый узел ищется не более одного раза и только один раз.

Другие вопросы по тегам