説明した概念を視覚的に表現したものを次の図に示します。
このガイドでは、以下のセクションを取り上げて、バイナリ ツリーのすべてのリーフ ノードを出力するプロセスについて説明します。
- リーフノードを識別するにはどうすればよいですか?
- JavaScriptでバイナリツリーのすべてのリーフノードを左から右に印刷するにはどうすればよいですか?
- おまけのヒント: 二分木のリーフ ノードを右から左の方向に印刷する
- 結論
リーフノードを識別するにはどうすればよいですか?
” 葉 ” ノードは、子ノードを持たないノード、または具体的には、” を持つノードです。 身長 ' の ' 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 つのノードを受け入れるランダム関数を作成します。この関数には複数の「」が含まれています。 もし ” かどうかをチェックする条件 ノード ” は空ではなく、” 内にノードがありません。 左 ' そして ' 右 」方向の場合、そのノードは「」とみなされます。 葉 ” ノードが表示され、コンソールに表示されます。このガイドでは、バイナリ ツリーのすべての葉ノードを左から右、または右から左の方向に出力する手順を説明しました。