структуры данных — Выходная куча в виде дерева Переполнение стека

У меня есть массив $heap = array(9, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, 9, 8, 8, 9, 7, 9, 8, 8, 9, 9,); и я хочу вывести его как двоичное дерево, когда два дочерних узла мы можем узнать по этим формулам, $heap[$key*2+1] и второй $heap[$key*2+2], Я пытаюсь запустить, используя foreach, но получаю ошибку о неопределенном смещении 21. Вот так foreach:

foreach ($heap as $key => $value) {
echo $value;
if ($key != count($heap)) {
echo $heap[$key*2+1];
echo $heap[$key*2+2];
}
}

Что я делаю не так и как я могу это решить?

1

Решение

Я думаю, что ошибка в вашем чеке:

if ($key != count($heap)) {
echo $heap[$key*2+1];
echo $heap[$key*2+2];
}

Здесь может быть ситуация с $key*2+2 выходит за пределы массива. Добавьте чек для этого тоже. Попробуй использовать
bool array_key_exists ( mixed $key , array $array ), что-то вроде этого:

if ($key != count($heap)) {
if (array_key_exists($key*2 + 1, $heap)) echo $heap[$key*2 + 1];
if (array_key_exists($key*2 + 2, $heap) ) echo $heap[$key*2 + 2];
}

Как вы указали в комментарии, вы удваиваете значения в вашем коде. Этого можно избежать с помощью рекурсивной функции, например, (псевдокод):

printArray(i, aHeap) {
if (i < count($heap)) {
echo $heap[i];
printArray(2*i + 1, aHeap);
printArray(2*i + 2, aHeap);
}
}
1

Другие решения

Это просто уведомление, чтобы остановить его, просто определите смещение, просто проверив, существует ли ключ массива. Используйте код ниже

foreach ($heap as $key => $value) {
echo $value;
if ($key != count($heap)) {
if (array_key_exists($key*2 + 1, $heap)){ echo $heap[$key*2 + 1];}
if (array_key_exists($key*2 + 2, $heap) ){ echo $heap[$key*2 + 2]; }
}
}

Надеюсь, это поможет вам

1

На самом деле вы можете сделать это, не проверяя, существует ли ключ с for:

for($i = 0, $m = count($heap) - 1; $i < $m - 2; $i++) {
echo $heap[$i+1];
echo $heap[$i+2];
}

Это будет гарантировать, что ключ идет только на все индексы — 2, поэтому в последней итерации $ i + 2 будет последним ключом.

0
По вопросам рекламы [email protected]