如何在层次结构中查找根元素

时间:2014-04-29 14:51:52

标签: c#

我设置了这种情况:

具有属性" Children"的对象,它是相同类型的List。结构的深度是未知的。这就是对象的样子:

public class CustomType
{
   public Guid ID { get; set; }
   public string Name { get; set; }
   public List<CustomType> Children { get; set; }
}

现在我想搜索一个特定的名称,如果我找到了一个与此名称匹配的元素,我想知道它的根元素。例如:

  • rootElement的
    • 为anyelement
      • 为anyelement
        • FoundElement

我已经有了FoundElement,但我想知道它的顶级父元素。我希望我的问题是可以理解的。主要问题是对象中不存在的父链接......

这么久 克里斯

2 个答案:

答案 0 :(得分:1)

正如你所说,理想的是在课堂上拥有Parent属性。但是,如果要求不具备该功能,则应该检查所有候选根节点的所有后代。这可以递归地完成,如:

private bool HasDescendent(CustomType parent, CustomType descendent)
{
    if(parent.Children.Contains(descendent))
        return true;
    return parent.Children.Any(child => HasDescendent(child, descendent);
}

private CustomType FindRoot(IEnumerable<CustomType> candidateRoots, CustomType node)
{
    return candidateRoots.First(root => HasDescendent(root, node));
}

答案 1 :(得分:0)

实现这一目标的唯一方法就是递归(我暂时没有完成C#,所以这里有一些伪代码):

list<items> findPath(root, needle):
    if root == needle:
         return [needle]
    for child in root.children:
         if findPath(child, needle) != Null:
              return [root].concat(findPath(child, needle))
    return Null

这应该是从根节点到针的路径。