C#中的树数据结构

时间:2020-03-05 18:54:31  来源:igfitidea点击:

我在C中寻找树或者图数据结构,但我猜没有提供。使用C2.0进行的数据结构的广泛检查解释了一些原因。是否有一个方便使用的库通常用于提供此功能?也许可以通过一种策略模式来解决本文中提出的问题。

我实现自己的树有点愚蠢,就像实现自己的ArrayList一样。

我只想要可以不平衡的通用树。想一想目录树。 C5看起来很漂亮,但是它们的树结构似乎被实现为平衡的红黑树,比表示节点的层次结构更适合于搜索。

解决方案

回答

通常来说非常出色的C5通用收藏库具有几种不同的基于树的数据结构,包括集合,包装袋和字典。如果我们想研究其实现细节,可以使用源代码。 (尽管我没有专门使用任何树结构,但我在生产代码中使用了C5集合,效果很好。)

回答

我最好的建议是,没有标准的树数据结构,因为我们可以通过多种方法来实现它,以至于不可能用一个解决方案覆盖所有基础。解决方案越具体,就越不可能适用于任何给定的问题。我甚至对LinkedList感到恼火,如果我想要一个循环的链表怎么办?

我们需要实现的基本结构将是节点的集合,这是一些入门的选项。假设Node类是整个解决方案的基类。

如果只需要在树上导航,则Node类需要一个子级列表。

如果需要在树上导航,则Node类需要一个指向其父节点的链接。

构建一个AddChild方法,该方法处理这两点的所有细节以及必须实现的任何其他业务逻辑(子级限制,对子级进行排序等)

回答

如果我们想编写自己的文档,则可以从这份分为六部分的文档开始,详细介绍C2.0数据结构的有效用法以及如何分析C#中数据结构的实现。每篇文章都有示例,以及带有示例的安装程序。

Scott Mitchell使用C2.0全面检查数据结构

回答

我不愿承认这一点,但最终还是使用链表编写了自己的树类。在一个不相关的注释上,我刚刚发现了这种圆形物品,当将其连接到我称为"车轴"的物品时,可以更轻松地运输货物。

回答

delegate void TreeVisitor<T>(T nodeData);

class NTree<T>
{
    private T data;
    private LinkedList<NTree<T>> children;

    public NTree(T data)
    {
         this.data = data;
        children = new LinkedList<NTree<T>>();
    }

    public void AddChild(T data)
    {
        children.AddFirst(new NTree<T>(data));
    }

    public NTree<T> GetChild(int i)
    {
        foreach (NTree<T> n in children)
            if (--i == 0)
                return n;
        return null;
    }

    public void Traverse(NTree<T> node, TreeVisitor<T> visitor)
    {
        visitor(node.data);
        foreach (NTree<T> kid in node.children)
            Traverse(kid, visitor);
    }
}

简单的递归实现...
<40行代码...
我们只需要在类外部保留对树根的引用,
或者将其包装在另一个类中,也许重命名为TreeNode?

回答

见http://quickgraph.codeplex.com/

QuickGraph为.Net 2.0及更高版本提供通用的有向/无向图数据结构和算法。 QuickGraph带有诸如深度优先搜索,呼吸优先搜索,A *搜索,最短路径,k最短路径,最大流量,最小生成树,最不常见祖先等算法,... QuickGraph支持MSAGL,GLEE和Graphviz渲染图,序列化为GraphML等...