检索树路径列表

use*_*417 2 c# linq tree

我目前有一棵树,我正在使用此处找到的代码功能遍历 C# 中的一棵树以获取我的树中的路径。问题是,此代码当前返回我的树中每个路径的列表。例如,如果我有以下树:

A---
    |
    ---B
    |
    ---C
       |
       ---D
       |
       ---E
Run Code Online (Sandbox Code Playgroud)

代码将返回 {A},{A,B},{A,C},{A,C,D},{A,C,E}

我实际上需要它来返回分支,即{A,B},{A,C,D},{A,C,E}。

这不必是上述方法的一部分,只要最后我得到的列表只是分支而不是每条路径。

我真正想弄清楚的是如何从上述方法中过滤 IEnumerable 列表,使其仅包含每个列表中最后一个元素没有子元素的条目。

所以在我当前的代码中:

class Node
{
     public string Name;
     public int ParentID;
     public List<Node> Children;
}
Run Code Online (Sandbox Code Playgroud)

然后在我的主代码中

List<Node> listOfNodes = getTreeNodes();

Node rootNode = listOfNodes.Where(n => n.ParentID == 0).FirstOrDefault();
// the below paths var will have every path instead of just the branches
var paths = ComputePaths(rootNode, n=>n.Children);
Run Code Online (Sandbox Code Playgroud)

使用链接答案中的代码:

static IEnumerable<IEnumerable<T>> ComputePaths<T>(T Root, Func<T, IEnumerable<T>> Children) {
    yield return new[] { Root };
    foreach (var Child in Children(Root)) 
        foreach (var ChildPath in ComputePaths(Child, Children)) 
            yield return new[] { Root }.Concat(ChildPath);            
}
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的。任何帮助将不胜感激。

Rob*_*Rob 7

这有效:

static IEnumerable<IEnumerable<T>> ComputePaths<T>(T Root, Func<T, IEnumerable<T>> Children) {
    var children = Children(Root);
    if (children != null && children.Any())
    {
        foreach (var Child in children) 
            foreach (var ChildPath in ComputePaths(Child, Children)) 
                yield return new[] { Root }.Concat(ChildPath);            
    } else {
        yield return new[] { Root };
    }
}
Run Code Online (Sandbox Code Playgroud)

如果节点是叶节点(没有子节点),我们返回自身。否则,我们返回它的孩子的路径。