我有一个递归函数,它返回给定起始根节点的所有子树节点。
private IEnumerable<Node> getAllNodesRecursively(Node subnode)
{
    foreach (Node node in subnode.Nodes)
        getAllNodesRecursively(node);
    yield return subnode;
}对于以下树结构:
A
|
+--B
|
+--C
|  |
|  +--D
|
+--E当我尝试这样迭代时:
foreach (Node n in getAllNodesRecursively(a))
{
    Console.WriteLine(n);
}该函数返回唯一的A值。
我希望使用带有递归的yield return,并检索前序中的元素(本例中为A、B、C、D、E)。
(如果我把收益率放在foreach之前,foreach就永远不会发生)。
这个是可能的吗?
发布于 2012-02-03 18:15:44
你有没有尝试过这样的东西:
private IEnumerable<Node> getAllNodesRecursively(Node subnode) 
{ 
    // Return the parent before its children
    yield return subnode; 
    foreach (Node node in subnode.Nodes) 
    {
        foreach(Node n in getAllNodesRecursively(node))
        {
            yield return n;
        }
    }
} 您的实现是递归调用getAllNodesRecursively,但是忽略了它的返回值。
发布于 2012-02-03 17:53:46
是的,这是可能的,只要把yield return放在foreach之前。您正在考虑普通return语句的行为。
发布于 2016-08-14 19:40:35
你需要显式迭代+输出返回每个节点的子节点ala:
        public IEnumerable<int> preOrder(Node root)
        {
            if (root == null)
                yield break;
            yield return root.val;
            if (root.left != null)
                foreach (int i in preOrder(root.left))
                    yield return i;
            if (root.right != null)
                foreach (int i in preOrder(root.right))
                    yield return i;
        }https://stackoverflow.com/questions/9126675
复制相似问题