ホームページ >バックエンド開発 >C++ >各ノードがその子の積である完全なバイナリ ツリーの数

各ノードがその子の積である完全なバイナリ ツリーの数

WBOY
WBOY転載
2023-08-26 15:01:061093ブラウズ

各ノードがその子の積である完全なバイナリ ツリーの数

フル バイナリ ツリーは、すべての親ノードが 2 つの子ノードを持つか、子ノードを持たない特殊なタイプのバイナリ ツリーです。データ構造では、これらのタイプのツリーはバランスが取れており、組織化された表現であると考えられます。完全なバイナリ ツリーには、各親ノードがその子の積であるという固有の特性がある場合があります。

この記事では、C を使用して各ノードがその子の積になるように完全なバイナリ ツリーの数を計算するさまざまな方法について説明します。

入力シナリオと出力シナリオ

たとえば、配列 {1, 5, 3, 4} には、単一ノード 1 (1 x 1)、5 (1 x 5)、3 (1 x 3)、および 4 (1 x) が 4 つだけあります。 4 ).

リーリー

指定された配列で、最大値未満の各要素の倍数をすべて使用すると、配列内に倍数がある場合、完全なバイナリ ツリーを作成できます。したがって、配列内の最大値を見つけます。

配列内の小さい値が大きい値の倍数である可能性があることがわかっているため、最小値から最大値まで反復してそのようなバイナリ ツリーを見つけることから始めます。

動的プログラミングを使用する

ここでは、動的プログラミングを使用して、各ノードがその子の積となる完全なバイナリ ツリーの数を見つけます。配列要素を反復処理し、上記の条件を満たす可能性のあるツリーを見つけます。これらの解を dp ベクトルに保存します。

  • まず、 で定義された INT_MAX 定数と INT_MIN 定数を使用して、配列内の最大値と最小値を見つけます。 Cヘッダーにあります。 for ループを繰り返して最大値と最小値を更新します。

  • 次に、配列の最小値から最大値までを繰り返すネストされたループがあります。このループでは、dp ベクトルがゼロ以外であるかどうかを確認します。

  • dp ベクトルがゼロ以外の場合、(j j) から最大値まで j の倍数に対して別の for ループを実行します。それぞれの倍数について、複数あるかどうかを確認します。

  • 複数ある場合、可能な完全バイナリ ツリーの数は、arr[j] 完全バイナリ ツリーの数と arr[j]/k## に等しくなります。 #。

  • データのオーバーフローを防ぐために、現在更新されている

    dp 値のモジュロ 1000000007 を結果に追加します。

  • ###例### リーリー ###出力### リーリー

- ここで、プログラムの時間計算量は

O(N^2)

です。

###結論は### 各ノードがそれ自体の子の生成となる完全なバイナリ ツリーの数を見つける方法について説明しました。この問題は、部分問題の解を dp ベクトルに保存するという動的アプローチを使用して解決します。単純なネストされた for ループを使用して、配列の最小値から最大値まで反復し、目的のプロパティを持つ完全なバイナリ ツリーの可能な数を確認できます。

以上が各ノードがその子の積である完全なバイナリ ツリーの数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。