首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中遍历树的递归lambda表达式

在C#中遍历树的递归lambda表达式
EN

Stack Overflow用户
提问于 2008-09-14 05:17:44
回答 3查看 33.6K关注 0票数 66

谁能告诉我如何在C#中实现一个递归的lambda表达式来遍历树结构。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-14 10:44:57

好了,我终于找到了一些空闲时间。

我们开始吧:

代码语言:javascript
复制
class TreeNode
{
    public string Value { get; set;}
    public List<TreeNode> Nodes { get; set;}


    public TreeNode()
    {
        Nodes = new List<TreeNode>();
    }
}

Action<TreeNode> traverse = null;

traverse = (n) => { Console.WriteLine(n.Value); n.Nodes.ForEach(traverse);};

var root = new TreeNode { Value = "Root" };
root.Nodes.Add(new TreeNode { Value = "ChildA"} );
root.Nodes[0].Nodes.Add(new TreeNode { Value = "ChildA1" });
root.Nodes[0].Nodes.Add(new TreeNode { Value = "ChildA2" });
root.Nodes.Add(new TreeNode { Value = "ChildB"} );
root.Nodes[1].Nodes.Add(new TreeNode { Value = "ChildB1" });
root.Nodes[1].Nodes.Add(new TreeNode { Value = "ChildB2" });

traverse(root);
票数 80
EN

Stack Overflow用户

发布于 2008-09-14 08:39:11

一个合适的解决方案,实际上是许多函数式编程语言中惯用的解决方案,应该是使用fixed-point combinator。简而言之:定点组合器回答了这样一个问题:“我如何定义一个要递归的匿名函数?”但解决方案是如此重要,以至于整篇文章都在解释它们。

一种简单、实用的替代方法是“回到过去”,在定义之前使用C:声明的滑稽动作。尝试以下操作(“factorial”函数):

代码语言:javascript
复制
Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

就像一种护身符。

或者,对于类TreeNode的对象的预序树遍历,它适当地实现了IEnumerable<TreeNode>来遍历其子对象:

代码语言:javascript
复制
Action<TreeNode, Action<TreeNode>> preorderTraverse = null;
preorderTraverse = (node, action) => {
    action(node);
    foreach (var child in node) preorderTraverse(child, action);
};
票数 30
EN

Stack Overflow用户

发布于 2008-09-14 05:27:42

假设有一个虚构的对象TreeItem,它包含一个子集合来表示您的层次结构。

代码语言:javascript
复制
    public void HandleTreeItems(Action<TreeItem> item, TreeItem parent)
    {
        if (parent.Children.Count > 0)
        {
            foreach (TreeItem ti in parent.Children)
            {
                HandleTreeItems(item, ti);
            }
        }

        item(parent);
    }

现在调用它,传入处理一项的lambda,方法是将其名称打印到控制台。

代码语言:javascript
复制
HandleTreeItems(item => { Console.WriteLine(item.Name); }, TreeItemRoot);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61143

复制
相关文章

相似问题

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