Индексация в дереве

Как мы знаем индекс - это уникальное значение каждого элемента. В моей программе индексирование работает немножко некорректно: введите сюда описание изображения

Введу немного в курс программы.

Это у меня небинарное дерево, которое ограничено 3 уровнями в иерархии и каждый родительский должен иметь 4 узла, но у нас присутсвует дисперсия = 2, из-за чего это значение разбрасывается [2;6].

Первое значение у каждого узла - это его уровень в иерархии

Второе значение у каждого узла - это его индекс

Третье значение у узла - это его ключ.

Как видите, эти "уникальные" значения еще не уникальны, так как иногда повторяются,мне нужно сделать так, чтобы значения индексов на одном уровне не повторялись, т.е. [0 ; число_узлов_на_уровне]. Как это сделать?

Вот структура дерева:

struct Node 
{
    int key = 0; //ключ
    int id = 0; //индекс
    int level = 0; //уровень в иерархии
    Node* parent = nullptr; //указатель на родителя
    Node** son = nullptr; //массив указателей на сыновей
    int count_son = 0; //количество сыновей
};

Функция создания дерева:

Node* createTree(Node* node, int id, int level, int dispersion)
{
    if (node->level < 3) {

        node->id = id;
        node->level = level;
        node->key = rand() % 100;

        node->count_son = rand() % (4+dispersion-1)+(4-dispersion); //dispersion can't be > than 4
        node->son = new Node * [node->count_son];
        level++;

        for (int i = 0; i < node->count_son; i++)
        {
            node->son[i] = new Node;
            node->son[i]->parent = node;
            node->son[i]->id = id+i; //i
            node->son[i]->level = level;
            node->son[i]->key = rand() % 100;
        }

        for (int i = 0; i < node->count_son; i++)
            createTree(node->son[i], id+i, level, dispersion);

        return node;
    }
    else node->count_son = 0;
    return node;
}

Ответы (1 шт):

Автор решения: DmitryK

Варианты:

  • после создания дерева снова пройти по нему и записать индексы
  • держать массив счетчиков int count[3] и индексу присваивать счетчик node->son[i]->id = count[level]; count[level]++;
    Непонятно одно - зачем это вообще? Зачем вообще это поле? Это же дерево, а не массив - по индексу к элементам не обратишься. И потом будут проблемы при вставке и удалении элемента, при перестановке элементов - после любой из этих операций нужно пройти по всему дереву и заново установить все индексы. Ответьте на вопрос - для какой операции нужно поле индекс?
→ Ссылка