C-递归中的类二叉树

C-递归中的类二叉树,c,recursion,binary-tree,C,Recursion,Binary Tree,递归对我来说太混乱了。。。 以下是用于创建类二进制树的结构: struct parent { char *name; Child *children; }; typedef struct parent Parent; struct child { struct Parent *Pptr; struct child *next; }; typedef struct child Child; 我希望遍历整个树,并在每个子/父节点(基本上是每个节点)

递归对我来说太混乱了。。。 以下是用于创建类二进制树的结构:

struct parent {
      char *name;
      Child *children;
};

typedef struct parent Parent;

struct child {
     struct Parent *Pptr;
     struct child *next;
};

typedef struct child Child;
我希望遍历整个树,并在每个子/父节点(基本上是每个节点)上调用名为birthdaygift()的函数

下面是我到目前为止尝试过的,但我认为它不起作用

tree(Parent *parent)  {
   Child* child = parent->children;

   birthdaygift(parent);
  if (child == NULL) {
    return;
  }
  while (child->next != NULL) {
    Parent * recurseparent = child->Pptr;
    tree(recurseparent);
  }
  birthdaygift(parent);
}

如果有人能给我一些建议,那会很有帮助吗

您的数据结构看起来非常奇怪,看起来您的子节点指向父节点,并且以某种方式将子节点中的子节点列表作为链接列表进行维护。。。。假设您打算使用二叉树,我将给出我的答案

现在,假设是这样,从一个子节点到父节点,然后从下一个子节点到父节点,会不会把你带到同一个节点?通常,二叉树是从顶部开始向下解析的

传统的二叉树具有来自父树的指针(例如,*left和*right),您可以通过使用伪代码中的深度优先搜索算法(基本上,一直向左递归直到节点用完,然后向右)遍历整个树

function gift_node(*node) {
    birthday_gift(node);

    if (node->left != NULL) gift_node(node->left);
    if (node->right != NULL) gift_node(node->right);
}

现在,如果您观看解析此二叉树的过程,您会看到它从顶部开始,并一直跟随左侧节点。然后,它将回溯、处理正确的节点及其从属节点,并继续运行,直到它访问了每个节点。

您声明的
结构
不是树,它类似于双链接列表

二叉树节点的结构应为:

struct BST_Node {
    Value value;
    BST_Node *right;
    BST_Node *left;
};
要遍历树,您需要访问每个节点。一种方法是递归地访问左侧的所有节点,然后访问节点本身,然后递归地访问右侧的所有节点(这称为顺序遍历,但在这种情况下这并不重要)

如果要在每个节点上调用
birthdaygift()

void traverse(Node *n) {
    if (n->left)
        traverse(n->left);
    birthdaygift(n);
    if (n->right)
        traverse(n->right);
}

可以找到其他树遍历算法的讨论。

澄清您的问题对您有好处。这是对您试图实现的结构的误解还是对结构本身的误解。Binary将树结构定义为由节点组成的树,这样每个节点都是一个子树,最多有2个子树(左和右)。这不同于具有指向下一个和上一个节点的链接的节点列表(双链接列表),这是您所拥有的。它不是一个2 LL,而是一个精细的n元树结构,节点类型名称选择较差。