树遍历没有递归/堆栈使用(C#)?

时间:2009-07-06 13:16:24

标签: performance stack tree-traversal

我正在使用WPF,我正在开发一个复杂的用户控件,它由一个功能丰富的树等组成。 为此,我使用了View-Model设计模式,因为某些操作无法直接在WPF中实现。所以我采用IHierarchyItem(它是一个节点并将其传递给此构造函数以创建树结构)

private IHierarchyItemViewModel(IHierarchyItem hierarchyItem, IHierarchyItemViewModel parent)
        {
            this.hierarchyItem = hierarchyItem;
            this.parent = parent;    

            List<IHierarchyItemViewModel> l = new List<IHierarchyItemViewModel>();
            foreach (IHierarchyItem item in hierarchyItem.Children)
            {
                l.Add(new IHierarchyItemViewModel(item, this));
            }
            children = new ReadOnlyCollection<IHierarchyItemViewModel>(l);
        }

问题是这个构造函数大约需要3秒!!在我的双核心上有200个项目。 我做anythig错误或递归构造函数调用是那么慢? 非常感谢你!

2 个答案:

答案 0 :(得分:4)

好吧我自己发现了一个非递归版本,虽然它使用了Stack。 它遍历整棵树:

Stack<MyItem> stack = new Stack<MyItem>();

stack.Push(root);

while (stack.Count > 0)
{
    MyItem taken = stack.Pop();

    foreach (MyItem child in taken.Children)                
       stack.Push(MyItem);                    

}

答案 1 :(得分:3)

树的递归实现应该没有任何问题,特别是对于这么少的项目。递归实现有时候空间效率较低,而且时间效率稍差,但代码清晰度通常会弥补它。

对构造函数执行一些简单的分析会很有用。使用以下建议之一:http://en.csharp-online.net/Measure_execution_time您可以自己指出每件作品的使用时间。

特别是一件作品可能需要很长时间。在任何情况下,这可能会帮助您缩小您真正花时间的地方。