繁体   English   中英

获取节点的所有子节点

[英]Get all Child of Node

我在下面有一个Node class:

public class Node {
        public int begin {get;set;}
        public int end {get;set;}
    }

然后我创建一个包含父母和孩子的列表,如下所示:

List<Node> list = new List<Node>();
list.Add(new Node(){begin = 1, end =2});
list.Add(new Node(){begin = 1, end =3});
list.Add(new Node(){begin = 2, end =4});
list.Add(new Node(){begin = 2, end =5});
list.Add(new Node(){begin = 5, end =6});
list.Add(new Node(){begin = 5, end =7});

这是上面列表的树数据:

        1
    2      3
  4   5
     6 7

如何找到节点的所有父节点? 例如,如果我的Node2 结果是: 4,5,6,7

我尝试了这段代码,但当我的Node24, 5

    public static List<int> FindChild(List<Node> list,int id) {
      int value = id;
        List<int> res = new List<int>();

      var child = list.Where(b => b.begin == id).ToList();
      foreach (var item in child) {
          res.Add(item.end);
          FindChild(list,item.end);
      }

      return res;
}

正如 canton7 在评论中提到的,您正在使用边而不是节点。

除此之外,您当前没有将递归FindChild调用中的每个项目添加到res

与其使用列表,不如使用IEnumerable更有效/更灵活:

public static IEnumerable<int> FindDescendants(IEnumerable<Edge> edges, int id)
{
    var children = edges.Where(b => b.begin == id);
    foreach (var child in children)
    {
       yield return child.end;
       foreach (var descendant in FindDescendants(edges, child.end))
       {
           yield return descendant.end;
       }
    }
}

如果需要列表,可以使用 LINQ:

List<int> descendants = FindDescendants(list, 2).ToList();

你真的很亲近!

您正确地找到了所有以2为父级的边,并且您正确地递归地遍历了2的所有子级以找到他们的子级。 唯一的问题是您正在丢弃这些信息!

public static List<int> FindChild(List<Node> list,int id) {
    int value = id;
    List<int> res = new List<int>();

    var child = list.Where(b => b.begin == id).ToList();
    foreach (var item in child) {
        res.Add(item.end);
        FindChild(list,item.end); // <-- You threw away the return value!
    }

    return res;
}

最简单的解决方案是将FindChild的返回值添加到res

res.AddRange(FindChild(list,item.end));

行得通


您可以稍微提高效率,并避免创建大量新列表并复制其内容:

public static List<int> FindChild(List<Node> input, int id)
{
    var result = new List<int>();
    FindChild(input, id, result);
    return result;
}

public static void FindChild(List<Node> input, int id, List<int> result) {
    int value = id;

    var child = input.Where(b => b.begin == id).ToList();
    foreach (var item in child) {
        result.Add(item.end);
        FindChild(input, item.end, result);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM