0

给定以下结构

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

4

1 回答 1

1

问题是您忽略了 recursive 的返回值nNode_find。如果返回的值非 NULL,则应直接返回。所以而不是

nNode_find(child, val);

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

此外,每次nNode_find调用应该只处理一个节点,而不是下降到孩子的孩子,或者这样;您需要进行一些调试打印,以确保每个节点最多搜索一次且仅搜索一次。

于 2017-06-25T19:19:36.353 回答