我如何过滤avl树的数据

时间:2019-11-09 06:32:27

标签: c++ avl-tree

我为班级做了最后的作业。关键是我们需要像文件浏览器一样使用树。我试图这样做,但我陷入了排序的困境(因为我们需要按大小,名称,日期等进行排序)。

我创建了一个名为File的类,并为该对象建立了索引。但是我意识到我无法按照我想要的标准对那棵树进行排序。我如何仅使用该树(或可能不使用树)按特定过滤器排序并打印所有数据(名称,大小,日期)。

void BuscarArchivos() {
    string path;
    cout << "Ingrese la ruta: "; //type the path
    cin >> path;

    Archivo * arc2;
    string test;
    for (const auto & entry : fs::directory_iterator(path)) {
        test = entry.path().string();
        arc2 = new Archivo(test);
        tree->Insert(arc2); //indexing the file class 
    }
}
void ImprimirArchivo()...

我想按条件对文件树进行排序。

1 个答案:

答案 0 :(得分:0)

对于每个标准,构建一个AVL树作为索引。索引仅用于引用存储在其他存储位置中的文件对象。

using Size = uint64_t;
using Name = std::string;
// using Data = whatever; 

struct Node {
    Size size; // file size
    Name name; // file name
    Data data; // whatever data
    explicit Node(const std::string &path) { /*omitted*/ }
    // construct from path
}

// Tree<Key, Data>
Tree<Size, std::shared_ptr<Node>> indexed_by_size_tree;
Tree<Name, std::shared_ptr<Node>> indexed_by_name_tree;
Tree<Data, std::shared_ptr<Node>> indexed_by_data_tree;

void Build() {
    std::string path;
    std::cin >> path;

    for (const auto &entry : fs::directory_iterator(path)) {
        auto node = std::make_shared<Node>(entry.path().string());
        indexed_by_size_tree.Insert(node->size, node); // size as key
        indexed_by_name_tree.Insert(node->name, node); // name as key
        indexed_by_data_tree.Insert(node->data, node); // data as key
    }
}

void TraverseOrderedBySize() {
    for (auto iter = indexed_by_size_tree.begin();
        iter != indexed_by_data_tree.end(); iter = std::next(iter)) {
        // deal with iter->key
    }
}