2

我正在使用 c# 和 List 集合并加载了值。完成后,我将尝试以递归方式阅读它们,但有些我无法做到这一点。

以下是我的主要代码。

    private static void Main(string[] args)
            {
                var node = new Node
                    {
                        Name = "N1",
                        Nodes =
                            new List<Node>
                                {
                                    new Node { Name = "N1a" },
                                    new Node { Name = "N1b", Nodes = new List<Node> { new Node { Name = "N1B1" } } },
                                    new Node
                                        {
                                            Name = "N1c",
                                            Nodes =
                                                new List<Node> { new Node { Name = "N1C1", Nodes = new List<Node> {new Node{Name = "N1C1A"} } } }
                                        }
                                }
                    };
                GetNodes( node );
                Console.ReadLine();
            }

 public class Node
        {
            public string Name { get; set; }

            public IList<Node> Nodes { get; set; }
        }

并且函数调用如下

public static IEnumerable<Node> GetNodes(Node node)
        {
            if (node == null)
            {
                return null;
            }

            Console.WriteLine(node.Name);

            foreach (var n in node.Nodes)
            {
                return GetNodes(n);
            }

            return null;
        }
    }  

有人可以帮我修复递归函数吗?

4

4 回答 4

6

如果您只想打印所有节点的名称,

public static void GetNodes(Node node)
{
    if (node == null)
    {
        return;
    }
    Console.WriteLine(node.Name);
    foreach (var n in node.Nodes)
    {
        GetNodes(n);
    }
}

如果你想把树弄平,

public static IEnumerable<Node> GetNodes(Node node)
{
    if (node == null)
    {
        yield break;
    }
    yield return node;
    foreach (var n in node.Nodes)
    {
        foreach(var innerN in GetNodes(n))
        {
            yield return innerN;
        }
    }
}
于 2012-09-27T11:29:03.640 回答
2
public static IEnumerable<Node> GetNodes(Node node)
{
    if (node == null) return null;

    var nodes = new List<Node>();
    nodes.Add(node);

    Console.WriteLine(node.Name);

    if (node.Nodes != null)
    {
        foreach (var n in node.Nodes)
        {
            nodes.AddRange(GetNodes(n));
        }
    }

    return nodes;
}}
于 2012-09-27T11:58:32.873 回答
1

您的方法仅每个返回 null,或调用自身,然后返回 null,或调用自身.....所以在一天结束时它返回 null 或不终止。如果您想序列化这些值,您可以在将它们写入控制台时将它们写入代码中的同一点的列表中。

public static void GetNodes(Node node, List<Node> output)
{
    if (node == null)
        return;

    output.Add(node);
    Console.WriteLine(node.Name);

    foreach (var n in node.Nodes)
    {
        GetNodes(n, output);
    }
}
于 2012-09-27T11:28:53.037 回答
0

在第一次迭代时,您会立即从循环内的方法返回。不执行其他迭代。

于 2012-09-27T11:29:34.913 回答