C 测试树的循环度?

C 测试树的循环度?,c,tree,C,Tree,我对数据结构仍然不是很在行,但我有一个家庭作业,要我测试一个树状结构是否是圆形的。也就是说,在某种形式下,节点上的左指针和右指针最终指向前面的节点 几个小时以来,我一直在尝试提出一个递归函数,但我似乎无法得到它。我也没有太多的工作要做。 有人能给我一些关于如何做这件事的想法吗? 我们使用的语言是C 谢谢。您需要检查算法 在维基百科链接上提供的伪代码中,您会注意到,在排序过程中,您会注意到任何循环引用 L ← Empty list that will contain the sorted elem

我对数据结构仍然不是很在行,但我有一个家庭作业,要我测试一个树状结构是否是圆形的。也就是说,在某种形式下,节点上的左指针和右指针最终指向前面的节点

几个小时以来,我一直在尝试提出一个递归函数,但我似乎无法得到它。我也没有太多的工作要做。 有人能给我一些关于如何做这件事的想法吗? 我们使用的语言是C


谢谢。

您需要检查算法

在维基百科链接上提供的伪代码中,您会注意到,在排序过程中,您会注意到任何循环引用

L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
    remove a node n from S
    insert n into L
    for each node m with an edge e from n to m do
        remove edge e from the graph
        if m has no other incoming edges then
            insert m into S
if graph has edges then
    **output error message (graph has at least one cycle)**
else 
    output message (proposed topologically sorted order: L)
编辑:


这个答案是在作者表示他基本上有一个双链表结构之前发布的。我发布它并不是因为我认为它在所有情况下都是最有效的答案,而是因为我们缺乏关于他的图表的信息(除了将其描述为“树”)这个答案应该可以处理大多数情况

弗洛伊德的“乌龟兔”算法应该能很好地解决这个问题。请看这里:


它非常适合于列表,但也可以适用于类似于遍历树的图形。

通常,最好的方法是使用深度优先搜索(DFS)。从根节点开始,将其标记为“已访问”,然后开始跟随指针。在您到达的每个新节点上,将其标记为“已访问”。如果你走到了死胡同,后退一步,尝试另一条路

如果您曾经跟随一个指针到达一个已经标记为已访问的节点,那么您就有了一个循环

以递归方式执行该操作如何:

struct node {
    struct node *left;
    struct node *right;
    bool visited;
};

bool check_tree(struct node *cur)
{
    if (cur == NULL)
        return true;

    if (cur->visited)
        return false; // uh oh. We've been here...
    cur->visited = true;
    return check_tree(cur->left)
           && check_tree(cur->right);
 }

 if (check_tree(&root))
     printf("No self-references here.\n");

(警告:代码可能有bug)

DFS或BFS并标记已访问的节点。所谓树状,我的意思是每个节点都有指向另一个节点的左指针和右指针。以及其他一些数据字段。带有标记的DFS/BFS不认为他的“树”包含“根”或“顶”级节点的概念吗?问题!树的形状不能是圆形的。对于可能是圆形的“树状结构”,正确的术语是图形:)+1-这是一个优雅而简单的解决方案。将此应用于树木应该很简单。否决此想法。此算法仅适用于列表,因为它们是一维的。一般来说,图形不是。所以“适应”这个算法的方法就是把它变成BFS。。。。这是一个很好的算法,“侵权”和“兔子”都需要自己独立的“堆栈”来跟踪它们在任何特定节点上是向左走还是向右走,但前提是满足了这一要求,我看不出有任何理由认为tortise和hare算法不适用于列表中的树。我认为这太笼统了。我的理解是,OP问题归结为“节点被多次引用”,而不是“序列重复”。