【问题标题】:Binary-like tree in C - recursionC中的二叉树 - 递归
【发布时间】:2015-01-05 15:29:10
【问题描述】:

递归对我来说太令人困惑了...... 以下是用于创建类二叉树的结构:

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);
}

如果有人能给我一些指点,那真的很有帮助吗?

【问题讨论】:

  • 你最好澄清你的问题。这是对您尝试实现的结构还是结构本身的误解。 Binary 将树结构定义为由节点组成的树,每个节点是最多有 2 个(左和右)子节点的子树。这与链接到下一个和前一个节点的节点列表(双向链表)不同,这就是你所拥有的。

标签: c recursion binary-tree


【解决方案1】:

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

现在,假设是这种情况,会不会从一个子节点上到父节点,然后从下一个子节点上升到 same 节点?通常,二叉树的解析方式是从上往下。

传统的二叉树具有来自父级的指针(对于本示例,*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);
}

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

【讨论】:

    【解决方案2】:

    你声明的struct不是树,它类似于双向链表。

    二叉树节点的结构是:

    struct BST_Node {
        Value value;
        BST_Node *right;
        BST_Node *left;
    };
    

    为了遍历一棵树,你想访问每一个节点。一种方法是递归地访问左侧的所有节点,然后是节点本身,然后递归地访问右侧的所有节点(这称为 in-order 遍历,但这不是t 对这种情况很重要)。

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

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

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

    【讨论】:

    • 它不是 2 LL,而是一个精细的 n 叉树结构,节点类型名称选择不佳。
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2014-03-29
    • 1970-01-01
    • 2010-12-07
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多