C中的二叉树 - 递归

Posted

技术标签:

【中文标题】C中的二叉树 - 递归【英文标题】:Binary-like tree in C - recursion 【发布时间】: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 个(左和右)子节点的子树。这与链接到下一个和前一个节点的节点列表(双向链表)不同,这就是你所拥有的。 【参考方案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 叉树结构,节点类型名称选择不佳。

以上是关于C中的二叉树 - 递归的主要内容,如果未能解决你的问题,请参考以下文章

对称的二叉树

二叉树-天然的递归

二叉树递归遍历的白话文讲解

用于在 JavaScript 中的二叉树中插入节点的递归函数中的错误

JS中的二叉树遍历

C语言数据结构,急求在线二叉树先序中序后序递归遍历