树中带有yield return元素顺序的递归

我有一个递归函数,在给定起始根节点的情况下返回所有子树节点。

private IEnumerable 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永远不会发生)。

这可能吗?

你尝试过类似的东西:

 private IEnumerable 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 ,但忽略其返回值。

是的,这是可能的,只是将yield returnforeach之前。 您正在考虑正常return语句的行为。

  public IEnumerable 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; }