Должно ли дерево быть сбалансированным? Должен ли алгоритм быть эффективным?
Если нет, то самое простое - создать дерево, в котором все левые дочерние элементы равны нулю, т. Е. Дерево, переходящее в связанный список.
Чтобы вставить, рекурсивно посмотрите, перейдите к нужному потомку, а затем обновите размер узла на обратном пути. Нечто подобное (псевдокод)
function insert(node, value, index, depth)
if depth < index
create the rightchild if necessary
insert( rightchild, value, index, depth + 1)
if depth == size
node.value = value
node.size = rightchild.size + 1
После того, как у вас все получится, вы можете изменить его, чтобы он был более сбалансированным. При увеличении длины списка добавьте узлы к левому или правому дочернему узлу, в зависимости от того, какой из них в настоящее время имеет наименьшее количество, и обновите размер при выходе из рекурсии.
Чтобы обобщение было более эффективным, вам нужно работать с индексом в терминах его двоичного представления.
Например, пустой список имеет один узел, без дочерних элементов со значением null и размером 0.
Скажем, вы хотите вставить «привет» в индекс 1034. Затем вы хотите получить дерево, корень которого имеет двух дочерних элементов, с размерами 1024 и 10. У левого дочернего элемента нет реальных дочерних элементов, но у правого узла есть правый дочерний элемент собственного размера 2. (подразумевается левый размер 8). Этот узел, в свою очередь, имеет одного правого дочернего элемента размера 0 со значением «привет». (Этот список имеет индекс на основе 1, но индекс на основе 0 аналогичен.)
Таким образом, вам нужно рекурсивно разбивать индекс на его двоичные части и добавлять узлы по мере необходимости. При поиске в списке вам нужно соблюдать осторожность при обходе узла с нулевыми дочерними элементами