1

私は配列を持っていて、この式で2$heap = array(9, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, 9, 8, 8, 9, 7, 9, 8, 8, 9, 9,);つの子ノードを知ることができるとき、バイナリツリーのように出力したいと思います。foreach を使用して実行しようとしましたが、未定義のオフセット 21 に関するエラーが発生しました。これが foreach です。$heap[$key*2+1]$heap[$key*2+2]

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

私が間違っていることと、これを解決するにはどうすればよいですか?

4

3 に答える 3

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];
}

コメントで指摘したように、コード内の値を 2 倍にしています。これは、次のような再帰関数によって回避できます (疑似コード):

printArray(i, aHeap) {
    if (i < count($heap)) {
        echo $heap[i];
        printArray(2*i + 1, aHeap);
        printArray(2*i + 2, aHeap);
    }
}
于 2015-01-13T08:44:11.753 に答える
0

実際には、キーが for で存在するかどうかを確認せずにこれを行うことができます。

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

これにより、キーがすべてのインデックス - 2 にのみ移動することが保証されるため、最後の反復では $i + 2 が最後のキーになります。

于 2016-03-29T07:27:45.747 に答える