可以有人告诉我如何实现递氧表达穿越树形结构。

有帮助吗?

解决方案

好吧,我找到一些空闲时间。
在这里,我们去:

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);

其他提示

一个适当的解决方案,并确的惯用的解决方案在许多编程语言功能,将使用一个 定点组合.一言以蔽之:一个定点组合的回答的问题是"如何定义的一个匿名的功能被递归的?".但是,该解决方案是如此重要,整个文章写的解释。

一个简单、务实替代方案是"回去的时间",滑稽的C:《宣言》之前的定义。试试下面(的"因素"的功能):

Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

就像一个特色。

或者,对于预先了树历上的一个目的类 TreeNode 它实现了 IEnumerable<TreeNode> 适当去了它的儿童:

Action<TreeNode, Action<TreeNode>> preorderTraverse = null;
preorderTraverse = (node, action) => {
    action(node);
    foreach (var child in node) preorderTraverse(child, action);
};

一个简单的选择是"走回来的时间",滑稽的C和C++:《宣言》之前的定义。试试下面的:

Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

就像一个特色。

是的,不会的工作,与一个小小的警告。C#具有可变的引用。所以确保你不会不小心做事情是这样的:

Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

// Make a new reference to the factorial function
Func<int, int> myFact = fact;

// Use the new reference to calculate the factorial of 4
myFact(4); // returns 24

// Modify the old reference
fact = x => x;

// Again, use the new reference to calculate
myFact(4); // returns 12

当然,这个例子是有点做作,但这可能发生当使用可变的引用。如果您使用的组合子从 aku's链接,这将不会是可能的。

假设一个神秘的对象TreeItem,提一个儿童收集来代表你的层次结构。

    public void HandleTreeItems(Action<TreeItem> item, TreeItem parent)
    {
        if (parent.Children.Count > 0)
        {
            foreach (TreeItem ti in parent.Children)
            {
                HandleTreeItems(item, ti);
            }
        }

        item(parent);
    }

现在称呼的话,传递氧处理的一个项目,通过印刷名为控制台。

HandleTreeItems(item => { Console.WriteLine(item.Name); }, TreeItemRoot);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top