首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >树中具有yield返回元素顺序的递归

树中具有yield返回元素顺序的递归
EN

Stack Overflow用户
提问于 2012-02-03 17:51:07
回答 3查看 8.3K关注 0票数 11

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

代码语言:javascript
复制
private IEnumerable<Node> getAllNodesRecursively(Node subnode)
{
    foreach (Node node in subnode.Nodes)
        getAllNodesRecursively(node);

    yield return subnode;
}

对于以下树结构:

代码语言:javascript
复制
A
|
+--B
|
+--C
|  |
|  +--D
|
+--E

当我尝试这样迭代时:

代码语言:javascript
复制
foreach (Node n in getAllNodesRecursively(a))
{
    Console.WriteLine(n);
}

该函数返回唯一的A值。

我希望使用带有递归的yield return,并检索前序中的元素(本例中为A、B、C、D、E)。

(如果我把收益率放在foreach之前,foreach就永远不会发生)。

这个是可能的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-03 18:15:44

你有没有尝试过这样的东西:

代码语言:javascript
复制
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,但是忽略了它的返回值。

票数 17
EN

Stack Overflow用户

发布于 2012-02-03 17:53:46

是的,这是可能的,只要把yield return放在foreach之前。您正在考虑普通return语句的行为。

票数 3
EN

Stack Overflow用户

发布于 2016-08-14 19:40:35

你需要显式迭代+输出返回每个节点的子节点ala:

代码语言:javascript
复制
        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;
        }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9126675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档