Найти элемент в 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
вызов должен обрабатывать только один узел, а не передаваться потомкам потомков или тому подобное; Вы хотели бы сделать несколько отладочных отпечатков, чтобы убедиться, что каждый узел ищется не более одного раза и только один раз.