Cal c индексы массива сбалансированного бинарного дерева, которое выращивается по центру, а не лево, как типичная куча - PullRequest
0 голосов
/ 16 января 2020

Все знакомы с сохранением левостороннего сбалансированного двоичного дерева для минимальной кучи: 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...