Re: Дерево с O(1) доступом по ID
От: BlackEric http://black-eric.lj.ru
Дата: 09.01.26 20:29
Оценка: 84 (2)
Здравствуйте, Hоmunculus, Вы писали:


Можно попробовать как-то так. Массив узлов + массив указателей.

struct Node {
    std::vector<size_t> children;
    // ... другие данные узла
};

class Tree {
private:
    std::vector<Node> nodes;           // Все узлы хранятся здесь
    std::vector<size_t> free_ids;      // Список свободных ID
    size_t next_id = 0;
    
public:
    // Создание узла возвращает ID
    size_t createNode() {
        size_t id;
        if (!free_ids.empty()) {
            id = free_ids.back();
            free_ids.pop_back();
        } else {
            id = next_id++;
            if (id >= nodes.size()) {
                nodes.resize(id + 1);
            }
        }
        return id;
    }
    
    // Доступ за O(1)
    Node& getNode(size_t id) {
        return nodes[id];
    }
    
    void deleteNode(size_t id) {
        // Очищаем узел
        nodes[id].children.clear();
        // Добавляем ID в список свободных
        free_ids.push_back(id);
    }
https://github.com/BlackEric001
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.