2014-11-09 46 views
0

递归是我洙混乱... 下面是用于创建二进制树一样的结构:我想通过整个迭代二进制树一样 - 递归

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

如果有人能给我一些建议,这会非常有帮助吗?

+0

这将有利于你澄清你的问题。这是对您尝试实施的结构或结构本身的误解。 Binary将树结构定义为由节点组成的树,使得每个节点都是具有至多2个(左侧和右侧)子节点的子树。这与链接到下一个和前一个节点(双向链接列表)的节点列表不同,这就是你所拥有的。 – ChiefTwoPencils 2014-11-09 08:44:36

回答

1

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

现在,假设情况是这样,不会从一个孩子上升到父母,然后从下一个孩子上升到相同的节点?通常情况下,二叉树是从顶部开始向下进行解析的。

传统的二叉树有父指针(对于这个例子,*左和*右),你可以通过使用深度优先搜索算法遍历整个树(基本上,你继续左递归直到你用完的节点,然后你去右),在伪

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

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

现在,如果你看的过程中解析这个二叉树,你会看到它开始在顶部和保持左节点以下。然后它会回溯,处理正确的节点,并且它是下级节点,并继续前进,直到它访问了每个节点。

1

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

一个二叉树节点的结构将是:

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

的其他树的遍历算法的讨论可以发现here

+0

这不是一个2 LL,而是一个很好的n-ary树结构,节点类型名称选择很差。 – Gene 2014-11-10 00:23:59