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中的二叉树 - 递归的主要内容,如果未能解决你的问题,请参考以下文章