Все знакомы с сохранением левостороннего сбалансированного двоичного дерева для минимальной кучи: root находится в [0], его дети - [1] [2], большие дети - [3] [4] [ 5] [6], поэтому все индексы уровня L составляют <уровень L + 1. </p>
Что я хочу знать и не смог выяснить, так это то, насколько возможно и эффективно рассчитать индексы дочерние элементы данного узла в [i] для двоичного дерева сохраняют L-to-R в массиве в порядке, который вы получаете при обходе дерева по порядку (LNR).
Я нарисую то, что я значит, с числами, являющимися индексами массива узлов:
Typical heap order LNR order (think of it visually as "vertical column order")
0 3
/ \ / \
1 2 1 5
/ \ / \ / \ / \
3 4 5 6 0 2 4 6
Для простоты я предполагаю те же правила древовидной структуры, которые обычно используются в ситуации с кучей: двоичное дерево сбалансировано, и самый низкий уровень дерева «упакован влево» с точки зрения происхождения. Кроме того, меня не волнует сортировка или упорядочение значений узлов для моих целей.
В типичном сценарии кучи добавление или удаление узла с последнего уровня не влияет на индекс массива любого из узлов. на более высоких уровнях (так как все узлы более низких уровней полностью следуют за всеми узлами предыдущих уровней), но в моем сценарии это может:
Typical heap order LNR order
0 3
/ \ / \
1 2 1 4 (was 5, before removing 4 and 6)
/ \ / \
3 4 0 2
Другой способ задать это - вызвать cal c (без какого-либо априорного подсчета или маркировки поддерева), сколько узлов будет "LNR предшествовать" данному узлу. Я не хочу предварительно обрабатывать массив для подсчета размеров поддеревьев или чего-то подобного.
Учитывая индекс узла в массиве, я хочу назвать c lchild и rchild i. Я предполагаю, что знание уровня также может быть важно нести, но это соответствует потребностям Cal c.