合适的树数据结构

时间:2012-04-20 17:10:39

标签: algorithm data-structures tree

我一直在阅读树数据结构来模拟问题。我需要构建一个数据的内存表示,这与文件系统中的文件夹/文件表示非常相似(我并不暗示存储在磁盘中的实际文件,而是类似于资源管理器的结构)。树可能最多10个深度中间节点可能只有中等数量的子节点(比如10个),但可能有数千个叶子节点。[就像文件夹和文件中的数千个文件是叶子节点]

一些想法

  • 二进制树无法工作,因为一个节点最多只能有2个 儿童。 (说我们可以有3个子文件夹)
  • 非常通用的树实现可能效率低下,因为我可以对数据进行排序。就像左边的兄弟姐妹比右边的兄弟姐妹更小/更小。我希望这允许有效的遍历。
  • B树听起来非常接近,但它坚持平衡要求。在我的情况下,深度不会超过10,但不一定是所有深度分支。(比如c:/ windows,C:/ MyDoc ../ A / B / C)

请帮助您的体验。我应该自定义树或任何合适的数据结构(不是特定于编程语言)

4 个答案:

答案 0 :(得分:3)

您有两种不同的节点:文件和文件夹。

文件夹节点包含子集的集合(或映射),子节点本身可能是文件或文件夹。

或者,您可能更喜欢文件夹节点包含一组文件和一组文件夹。

对于集合,只需使用您喜欢的有序集合表示(可能是您使用的任何语言附带的集合)。根据您的具体情况,您可能更愿意使用地图。

答案 1 :(得分:1)

使用两个独立的数据结构:

  1. 搜索的二叉搜索树
  2. 用于表示的通用二叉树
  3. 并将这两者联系起来。

    注意:

    • 一般来说,树首先按顺序放置文件夹,并将所有文件放在BST中作为最后一个节点。

    或使用:

    Node:
        Node* Left_Most_Child_Folder;
        Node* Right_Sibling_Folder;
        BST_Node* Files_Root;
    

答案 2 :(得分:1)

在典型的文件系统中,“目录树”和搜索树不是一回事,通常是单独维护的。 “目录树”告诉您文件夹具有哪些文件/子文件夹,或者指向特定文件的路径,只是反映用户如何组织文件并且仅对用户有用。另一方面,搜索树维护所有文件的全局索引,以便于快速搜索。

例如,您可以实现类似Linux的文件系统,其中文件夹是记录其包含的其他文件/文件夹的指针的文件。同时你维护一个B +树,它将每个文件指针都作为一个叶子。 B +树的平衡条件与用户组织文件夹的方式无关。

答案 3 :(得分:0)

这样做的一种方法是使用二叉树的二叉树。例如:

Node
  Node* Children;
  Node* Left;
  Note* Right;

树的根是Node*

这样可以轻松遍历并快速插入和删除节点。当然,前提是您知道要插入节点的级别的路径,或者要知道要删除的节点的路径。但既然你表明你想要一个类似于Explorer的模型,我认为找到一个特定的水平不会造成问题。

在特定级别搜索节点就像搜索二叉树一样简单。

如果没有更多关于你想要建模的信息,那就是我能做的最好的事情。