如果我的直接问题不清楚,我道歉,我只知道如何通过以下示例解释这一点。
我试图计算连接到对象的子对象的数量。 每个对象只保存直接连接的子项
我有以下课程:
<h2>My title</h2>
<h2 class="my-other-title">My other title</h2>
我使用这些类生成以下对话框编辑器(见图)。
示例:
如果我在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 AB
和ABA
是哪个?所以正确的答案是2.连接到端口ABAA
和Answer B
的所有节点也应计算在内,如果它们存在的话。
我在提出想法方面没什么成功。
我使用类似以下功能的东西来获得一个问题的所有直接孩子:
Answer C
要获取所有子子对象,我将创建一个嵌套循环,并为其下的每个子项创建另一个嵌套循环。但我无法解决的问题是可能存在无限量的链接对象。
在这种情况下,是否存在迭代或计算对象的所有链接对象的结构方法?目的是检索链接对象的数量。
答案 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;
}
但如果至少有一个循环结构,则此代码将无效。