JavaScriptでバイナリツリーのすべてのリーフノードを左から右に印刷するにはどうすればよいですか?

Javascriptdebainaritsurinosubetenorifunodowo Zuokara Youni Yin Shuasurunihadousurebayoidesuka



バイナリ ツリーは頂点を介して接続された複数のノードで構成され、各ノードはその子ノードと呼ばれる最大 2 つの子ノードに接続できます。もし「」 ノード 「」には親ノードがありませんが、孫ノードを持ついくつかの子ノードが含まれており、「」として知られています。 ”ノード。ノードは「」です。 内側 ” ノードに親ノードと子ノードがある場合。 ” 「親ノードはあるが子ノードがない」ノードは、行き止まりになっているノードを意味します。

説明した概念を視覚的に表現したものを次の図に示します。







このガイドでは、以下のセクションを取り上げて、バイナリ ツリーのすべてのリーフ ノードを出力するプロセスについて説明します。



リーフノードを識別するにはどうすればよいですか?

” ノードは、子ノードを持たないノード、または具体的には、” を持つノードです。 身長 ' の ' 0 ”。ノードに「 身長 「より大きい」 0 」の場合、そのノードは内部ノードまたはルート ノードになる可能性があります。 ” 」ノードは通常、このノードが生成された元のソースを識別するためにバックトラックされます。これは主に、エラーや問題の原因を見つけるための検索アルゴリズムまたはエラー発見アルゴリズムで使用されます。



JavaScriptでバイナリツリーのすべてのリーフノードを左から右に印刷するにはどうすればよいですか?

アプローチは2つあります」 再帰的 ' そして ' 反復的な 」を使用して、目的の「提供されたバイナリ ツリーで使用可能なすべてのリーフ ノードを選択します」 ' に ' ' 方向。これらのアプローチの実際の実装については、以下のセクションで説明します。





方法 1: バイナリ ツリーのすべてのリーフ ノードを左から右に再帰的に出力します。

再帰的アプローチでは、すべてのノードが選択されます。 深さ優先検索アルゴリズム 最初に左側のノード全体を横断し、次に中央のノード、最後に右側のノードを横断する方法です。この操作は、すべてのノードに対して再帰的に実行され、「 」ノードが識別されます。この概念をより深く理解するには、以下のコード スニペットを参照してください。

クラス ノード
{
コンストラクタ (
{
これ コンテンツ = 0 ;
これ = ヌル ;
これ = ヌル ;
}
} ;

ここで、displayLeafNodes = ( ルートノード =>
{
もし ( ルートノード == ヌル
戻る ;

もし ( ルートノード。 == ヌル && ルートノード。 == ヌル
{
書類。 書く ( ルートノード。 コンテンツ + 「」 ;
戻る ;
}

もし ( ルートノード。 != ヌル
ディスプレイリーフノード ( ルートノード。 ;
もし ( ルートノード。 != ヌル
ディスプレイリーフノード ( ルートノード。 ;
}
サンプルノードでした = ( ヴァル =>
{
一時ノードでした = 新しい ノード ( ;
tempノード。 コンテンツ = ヴァル ;
tempノード。 = ヌル ;
tempノード。 = ヌル ;
戻る 一時ノード ;
}
ルートノードでした = provNode ( 3 ;
ルートノード。 = provNode ( 6 ;
ルートノード。 = provNode ( 9 ;
ルートノード。 = provNode ( 12 ;
ルートノード。 = provNode ( 15 ;
ルートノード。 = provNode ( 24 ;
ルートノード。 = provNode ( 18 ;
ルートノード。 = provNode ( 21 ;

ディスプレイリーフノード ( ルートノード ;

上記のコード ブロックの説明は次のとおりです。



  • まず、「」という名前のクラスを作成します。 ノード ”、新しいノードを作成し、その値を「」に設定します。 0 ”。添付の ' ' そして ' ” サイドノードは” に設定されます ヌル 」 デフォルトではクラス コンストラクターを使用します。
  • 次に、「」を定義します。 displayLeafNodes() ” という単一パラメータを受け入れる関数 ルートノード ”。このパラメータ値は、バイナリ ツリーの現在選択されているノードとみなされます。
  • 関数内では、「 もし ” ステートメントは、” ルートノード ” は null かそうでないか。の場合 ' ヌル ” そのノードに対するそれ以降の実行は停止されました。他のケースでは、rootNode「 ' そして ' ” サイドノードがチェックされます” ヌル ”。両方が null の場合、その「 ノード 」と印刷されます。
  • もし「」 ' または ' ” ノードが「null」ではない場合は、ノードのその側を「 displayLeafNodes() ” 再帰的な操作のための関数。
  • 「」という名前の新しい関数を定義します。 provNode() ” という単一パラメータを受け入れます。 ヴァル ”。関数内で「」の新しいインスタンスを作成します。 ノード 「」という名前のクラス 一時ノード ”。パラメトリック「」を割り当てます。 ヴァル ” クラスプロパティの値として” コンテンツ 」を選択し、「 ' そして ' ” サイドノードから” ヌル 」がデフォルトで設定されています。
  • 最後に、「」という名前のオブジェクトを作成します。 ルートノード ' のために ' provNode() ” 関数を作成し、この関数パラメーターとしてノード値を渡します。 「」を追加して左側と右側のノードを作成します。 ' そして ' ” キーワードを「rootNode」と組み合わせ、同じ関数を使用して値を割り当てます。 provNode() ”。
  • ” はルートノードの左の位置を意味し、” 左.左 「」の位置は左の左を意味します。「」の場合も同じアプローチが適用されます。 ' そして '
  • ツリーを定義した後、「rootNode」を引数として渡します。 displayLeadNodes() 」関数を使用して、作成したツリーのすべての葉ノードを選択して印刷します。

コンパイル後に生成された出力では、指定されたツリーのリーフ ノードが取得され、コンソールに出力されたことが確認されます。

方法 2: 反復アプローチを使用してバイナリ ツリーのすべてのリーフ ノードを出力する

反復的な 「」アプローチが最も効率的なアプローチであり、「」という概念を使用します。 押す ' そして ' ポップ 」を押して「 ”ノード。このアプローチの重要なポイントまたは仕組みを以下に示します。

クラス ノード
{
コンストラクタ ( 価値 )
{
これ データ = 価値 ;
これ = ヌル ;
これ = ヌル ;
}
} ;

ここで、displayLeafNodes = ( ルートノード ) =>
{
もし ( ルートノード )
戻る ;
レットリスト = [ ;
リスト。 押す ( ルートノード ) ;

その間 ( リスト。 長さ > 0 ) {
ルートノード = リスト [ リスト。 長さ - 1 ;
リスト。 ポップ ( ) ;
もし ( ルートノード。 && ルートノード。 )
書類。 書く ( ルートノード。 データ + 「」 ) ;
もし ( ルートノード。 )
リスト。 押す ( ルートノード。 ) ;
もし ( ルートノード。 )
リスト。 押す ( ルートノード。 ) ;
}
}

ルートノードでした = 新しい ノード ( 3 ) ;
ルートノード。 = 新しい ノード ( 6 ) ;
ルートノード。 = 新しい ノード ( 9 ) ;
ルートノード。 = 新しい ノード ( 12 ) ;
ルートノード。 = 新しい ノード ( 15 ) ;
ルートノード。 = 新しい ノード ( 24 ) ;
ルートノード。 = 新しい ノード ( 18 ) ;
ルートノード。 = 新しい ノード ( 21 ) ;

ディスプレイリーフノード ( ルートノード ) ;

上記のコードの説明を以下に書きます。

  • まず、「」を作成します。 ノード 「単一のパラメータを受け取るクラス」 価値 」を新しく作成したノードの値として設定し、左側と右側をnullに設定します。上の例で行ったのと同じです。
  • 次に関数「」を作成します。 displayLeafNodes() ” という単一パラメータを受け入れます。 ルートノード ”。この「rootNode」はバイナリ ツリーとみなされ、最初にその空性がチェックされます。
  • ノードが空でない場合は、「」という名前の空のリストが作成されます。 リスト ” が作成され、” ルートノード ” パラメータは、” を使用してそれに挿入されます。 押す() ' 方法。
  • そうして ' その間() ” の長さまで実行する” が利用されます。 リスト ”。ループ内では、ツリーの一番下にある要素、または「 リスト 「」は「」を使用して削除されます ポップ() ' 方法。
  • さて、「」の存在。 ' そして ' 「rootNode」の「」側をチェックし、両方が存在しない場合は子ノードが存在しないことを意味します。次に、このノードは画面上に表示され、リーフ ノードとして識別されます。
  • 左側または右側にノードがある場合は、そのノードに子があることを意味します。するとその「 ' そして ' 「」ノードが「」にプッシュされます リスト 」を使用して、リーフ ノードを見つけるさらなる操作を実行します。
  • 最後に、ノード値を「」のパラメータとして渡して、カスタム バイナリ ツリーを作成します。 ノード ” クラスのコンストラクター。作成後、ツリー「rootNode」を「」の引数として渡します。 displayLeafNodes() ' 関数。

コンパイル後に生成された出力には、指定されたツリーのリーフ ノードが出力されることが示されています。

おまけのヒント: 二分木のリーフ ノードを右から左の方向に印刷する

「」内に子ノードを持たないすべてのリーフノードを取得するには、 ' に ' 」という方向の場合は、簡単な再帰的アプローチが最も推奨されます。たとえば、上のセクションで説明したのと同じツリーを使用してリーフ ノードを取得しますが、「 ”へ” 以下に示すように、「」方向:

クラス ノード
{
コンストラクタ ( 価値 )
{
これ データ = 価値 ;
これ = ヌル ;
これ = ヌル ;
}
} ;


関数表示リーフノード ( )
{
もし ( == ヌル )
{
戻る ;
}

もし ( 根。 == ヌル && 根。 == ヌル )
{
書類。 書く ( 根。 データ + 「」 ) ;
戻る ;
}
もし ( 根。 != ヌル )
{
ディスプレイリーフノード ( 根。 ) ;
}
もし ( 根。 != ヌル )
{
リーフノードの表示 ( 根。 ) ;
}
}


ルートノードでした = 新しい ノード ( 3 ) ;
ルートノード。 = 新しい ノード ( 6 ) ;
ルートノード。 = 新しい ノード ( 9 ) ;
ルートノード。 = 新しい ノード ( 12 ) ;
ルートノード。 = 新しい ノード ( 15 ) ;
ルートノード。 = 新しい ノード ( 24 ) ;
ルートノード。 = 新しい ノード ( 18 ) ;
ルートノード。 = 新しい ノード ( 21 ) ;

ディスプレイリーフノード ( ルートノード ) ;

上記のコードは次のように動作します。

  • まずはクラス「 ノード 」が作成され、デフォルトのコンストラクターを使用して、上記の例で行われたリンクだけをツリーに新しいノードを追加します。
  • 次に、「 displayLeadNodes() ” という単一パラメータを受け入れる関数が作成されます。 ルートノード ”。このパラメータは「 ヌル 「」による条件 もし ' 声明。
  • 提供されたノードが true でない場合、その「 ' そして ' ” サイドノードがチェックされます” ヌル ' 状態。両方が null の場合、ノードは「」として識別されます。 」ノードにアクセスし、Web ページ上に印刷します。
  • その後、「」を渡します。 ' そして ' の「」ノード ルートノード ”へ” displayLeafNodes() ' 関数。
  • 「」を使用してインスタンスを作成し、各ノードの位置を割り当てます。 新しい ” キーワードと” ノード() ” コンストラクターを作成し、コンストラクターのパラメーターとして位置を指定します。
  • ” はルートノードの左の位置を意味し、” 左.左 」ポジションは左または左を意味します。同じアプローチが「」の場合にも適用されます。 ' そして ' ”。
  • 最後に「」を渡します。 ルートノード 」の議論として displayLeafNode() ' 関数。

生成された出力は、リーフ ノードが右から左の方向に印刷されることを示しています。

これで、バイナリ ツリーのすべてのリーフ ノードを任意の方向に出力することができます。

結論

バイナリ ツリーのすべてのリーフ ノードを出力するには、値を作成してツリー ノードに割り当てるランダム クラスを作成します。次に、上から下の階層でツリーの 1 つのノードを受け入れるランダム関数を作成します。この関数には複数の「」が含まれています。 もし ” かどうかをチェックする条件 ノード ” は空ではなく、” 内にノードがありません。 ' そして ' 」方向の場合、そのノードは「」とみなされます。 ” ノードが表示され、コンソールに表示されます。このガイドでは、バイナリ ツリーのすべての葉ノードを左から右、または右から左の方向に出力する手順を説明しました。