我有一个递归函数,在给定起始根节点的情况下返回所有子树节点。
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与递归一起使用并检索Preorder中的元素(本例中为A,B,C,D,E)。
(如果我把收益率的回报放在foreach之前,那么foreach永远不会发生。)
这可能吗?
答案 0 :(得分:16)
你有没有试过像:
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
,但忽略其返回值。
答案 1 :(得分:3)
是的,可以将yield return
放在foreach
之前。您正在考虑正常return
语句的行为。
答案 2 :(得分:1)
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;
}