树中带有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 return
在foreach
之前。 您正在考虑正常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; }