如何计算任意数量的链接子对象?

时间:2017-09-03 21:14:02

标签: c# algorithm

如果我的直接问题不清楚,我道歉,我只知道如何通过以下示例解释这一点。

我试图计算连接到对象的子对象的数量。 每个对象只保存直接连接的子项

我有以下课程:

<h2>My title</h2>
<h2 class="my-other-title">My other title</h2>

我使用这些类生成以下对话框编辑器(见图)。

Dialog editor example

示例: 如果我在class Question { public int ID { get; set; } //Primary key public string Text { get; set; } public string[] Options { get; set; } public string Answer { get; set; } public List<Link> Links { get; set; } } class Link { public int ID { get; set; } public string Answer { get; set; } public int QuestionID { get; set; } //Foreign key } ,我怎么能弄清楚它下面有多少问题?在这种情况下,node ABABA是哪个?所以正确的答案是2.连接到端口ABAAAnswer B的所有节点也应计算在内,如果它们存在的话。

我在提出想法方面没什么成功。

我使用类似以下功能的东西来获得一个问题的所有直接孩子:

Answer C

要获取所有子子对象,我将创建一个嵌套循环,并为其下的每个子项创建另一个嵌套循环。但我无法解决的问题是可能存在无限量的链接对象。

在这种情况下,是否存在迭代或计算对象的所有链接对象的结构方法?目的是检索链接对象的数量。

2 个答案:

答案 0 :(得分:3)

你有一个tree,这是一个非常常见的数据结构。因为在树中,节点的每个子节点也是树,所以通常使用recursion来导航树。这也称为tree traversal

在您的情况下,当您只想计算树中的节点时,您只需要将其分解为更简单的问题(通常,这是解决难题时非常常见的方法):

如果你有一棵没有孩子的树,那么节点的数量就非常明确:它就是一个。现在,当您添加一个级别时,您有多少个节点?一个用于父母,一个用于每个孩子。

由于子节点也是树,您现在可以概括为:对于任何树,树中的节点数是一个加上每个子树的节点数。

这是您的递归定义,然后您可以使用它来创建递归函数来计算任何树中的节点总数:

public int CountNodes(Node tree)
{
    int count = 1; // current node

    foreach (var child in tree.Children)
    {
        count += CountNodes(child);
    }

    return count;
}

一旦你理解了这一点,在遍历树时做不同的事情也就不那么复杂了。例如,您可以在列表中收集它们,而不是计算节点;或者例如打印树的直观表示。

答案 1 :(得分:1)

您可以在问题中的所有GetDirectChildren上递归调用方法Link

public List<Question> GetDirectChildren(Question question) 
{
    var children = new List<Question>();

    if (question.Links.Count > 0)
    {
        foreach(Link link in question.Links)
        {
            Question curQuestion = myQuestions.FirstOrDefault(f => f.ID == link.QuestionID);
            children.Add(curQuestion);
            children.AddRange(GetDirectChildren(curQuestion));
        }
    }
    else
        return children;
}

但如果至少有一个循环结构,则此代码将无效。