トップページに戻る    次のPHPのサンプルへ    前のPHPのサンプルへ

Q25 左右対称の二分探索木


PHPのソース

<?php

// 場合の数[部分木のノード数] の配列
$PatternCntArr = array();
$PatternCntArr[0] = 1;
$PatternCntArr[1] = 1;

for($I = 2 ; $I <= 19 ; $I++){
    $PatternCntArr[$I] = 0;

    //頂点の分を引いたノード数
    $NodeCnt = $I - 1;

    // 左部分木のノード数でループ
    for($J = 0 ; $J <= $NodeCnt ; $J++){
        $RightNodeCnt = $NodeCnt - $J;
        $PatternCntArr[$I] += $PatternCntArr[$J] * $PatternCntArr[$RightNodeCnt];
    }

    printf('ノード数%02dだと、%d通り' , $I , $PatternCntArr[$I]);
    echo PHP_EOL;
}


実行結果

ノード数02だと、2通り
ノード数03だと、5通り
ノード数04だと、14通り
ノード数05だと、42通り
ノード数06だと、132通り
ノード数07だと、429通り
ノード数08だと、1430通り
ノード数09だと、4862通り
ノード数10だと、16796通り
ノード数11だと、58786通り
ノード数12だと、208012通り
ノード数13だと、742900通り
ノード数14だと、2674440通り
ノード数15だと、9694845通り
ノード数16だと、35357670通り
ノード数17だと、129644790通り
ノード数18だと、477638700通り
ノード数19だと、1767263190通り


解説

動的計画法で解いてます。