構造とアルゴリズム: バイナリツリーとマルチツリー

構造とアルゴリズム: バイナリツリーとマルチツリー

1. ツリー構造

1. 配列とリンクリスト

配列構造

配列ストレージは、要素に添字でアクセスするため、クエリ速度が速くなります。配列要素が順序付けられている場合は、バイナリ検索を使用して検索速度を上げることができます。新しい要素を追加すると複数の添字が移動する可能性がある場合は、効率が低くなります。

リンクリスト構造

リンク リストは要素を格納し、要素の追加や削除には効率的ですが、要素をトラバースするには毎回先頭ノードから開始する必要があり、非常に非効率的です。

ツリー構造により、データの保存と読み取りの効率が比較的向上します。

2. ツリー構造の概念

  • ルート ノード: ツリーのルート、つまり親ノードのないノード (上図のノード A など)。
  • 兄弟ノード: 同じ親ノードを持つ子ノード。図の点 B と C に示すように、
  • リーフ ノード: 子ノードを持たないノード。図に示すように、DEFG ノード。
  • 木の高さ: 最大層数。図に示すように、3 層あります。
  • パス: ルート ノードから指定されたノードへのルートを検索します。

ツリー構造はネストされた構造です。ツリー構造の外側の層と内側の層は同様の構造を持つため、この構造は多くの場合再帰的に表現できます。従来のデータ構造におけるさまざまなツリー図は、典型的なツリー構造です。ツリーは、ルート、左サブツリー、右サブツリーとして単純に表すことができます。 左のサブツリーと右のサブツリーにはそれぞれ独自のサブツリーがあります。

2. 二分木モデル

木には多くの種類があります。二分木は重要な種類の木構造です。各ノードが最大 2 つの子ノードを持つことができる形式は、二分木と呼ばれます。二分木の子ノードは、左ノードと右ノードに分かれています。多くの実用的な問題から抽象化されたデータ構造は、多くの場合、二分木の形式になっています。

完全な二分木

バイナリ ツリーのすべてのリーフ ノードは、最後のレイヤーまたは最後から 2 番目のレイヤーにあり、最後のレイヤーのリーフ ノードは左側で連続しており、最後から 2 番目のレイヤーのリーフ ノードは右側で連続しています。これを完全バイナリ ツリーと呼びます。

完全な二分木

バイナリ ツリーのすべてのリーフ ノードが最後のレイヤーにあり、ノードの総数が 2^n -1 (n はレイヤーの数) の場合、そのツリーは完全バイナリ ツリーと呼ばれます。

バランスのとれた二分木

バランスのとれた二分木とは、任意のノードのサブツリーの高さの差の絶対値が 1 以下であり、左右のサブツリーが両方ともバランスのとれた二分木であることを意味します。一般的なバランスのとれた木には、B ツリー (多方向バランス探索木)、AVL ツリー (二分バランス探索木) などがあります。

二分探索木

二分探索木 (BinarySearchTree) は二分木であるだけでなく、特定の順序も満たします。つまり、ノードの左の子はそれ自体よりも小さく、ノードの右の子はそれ自体よりも大きくなります。

3. バイナリツリーエンコーディング

1. 基本コード

ノードコード

  1. クラス TreeNode {
  2. プライベート文字列 num ;
  3. プライベート TreeNode leftNode;
  4. プライベート TreeNode rightNode ;
  5. パブリックTreeNode(文字列 num) {
  6. this.num = num;
  7. } @オーバーライド
  8. パブリック文字列toString() {
  9. 戻る  "TreeNode{num=" + num + '}' ;
  10. }}

ツリー構造コード

  1. クラス BinaryTree01 {
  2. プライベート TreeNode ルート;
  3. }

2. トラバーサルと検索

事前順序トラバーサル検索

まず現在のノードのデータを処理し、次に左のサブツリーと右のサブツリーを順番に再帰的にトラバースします。

  1. パブリックvoid prevTraverse() {
  2. // 親ノードを出力する
  3. System.out.println (これ) ;
  4. // 左のサブツリーを前順に再帰的に走査する
  5. if (this.leftNode != null ) {
  6. this.leftNode.prevTraverse();
  7. } // 右のサブツリーを前順序で再帰的に走査する
  8. if (this.rightNode != null ) {
  9. this.rightNode.prevTraverse();
  10. }} public TreeNode prevSearch(String num) { //現在のノードを比較する
  11. if (this.num.equals(num)) {
  12. これを返します
  13. } // 左のサブツリーを再帰的に走査して検索する
  14. ツリーノード findNode = null ;
  15. if (this.leftNode != null ) {
  16. findNode = this.leftNode.prevSearch(num);
  17. } // 左サブツリーのトラバーサルヒット
  18. findNode がnull場合
  19. findNodeを返します
  20. } // 右のサブツリーを再帰的に走査して検索する
  21. if (this.rightNode != null ) {
  22. findNode = this.rightNode.prevSearch(num);
  23. } findNodeを返します
  24. }

順序探索検索

まず左のサブツリーを再帰的に走査し、次に親ノードを処理し、次に右のサブツリーを再帰的に走査します。

  1. パブリックボイドmidTraverse() {
  2. // 左のサブツリーを再帰的に走査する
  3. if (this.leftNode != null ) {
  4. this.leftNode.midTraverse();
  5. } // 親ノードを出力する
  6. System.out.println (これ) ;
  7. // 右のサブツリーを再帰的に走査する
  8. if (this.rightNode != null ) {
  9. this.rightNode.midTraverse();
  10. }} public TreeNode midSearch(String num) { // 左のサブツリーを再帰的に走査して検索する
  11. ツリーノード findNode = null ;
  12. if (this.leftNode != null ) {
  13. findNode = this.leftNode.midSearch(num);
  14. } の場合 (findNode != null ) {
  15. findNodeを返します
  16. } // 現在のノードを比較する
  17. if (this.num.equals(num)) {
  18. これを返します
  19. } // 右のサブツリーを再帰的に走査して検索する
  20. if (this.rightNode != null ) {
  21. findNode = this.rightNode.midSearch(num);
  22. } findNodeを返します
  23. }

後順序トラバーサル検索

まず左のサブツリーを再帰的にトラバースし、次に右のサブツリーを再帰的にトラバースし、最後に親ノードを処理します。

  1. パブリックボイドlastTraverse() {
  2. // 左のサブツリーを後順に再帰的に走査する
  3. if (this.leftNode != null ) {
  4. this.leftNode.lastTraverse();
  5. } // 右のサブツリーを後順で再帰的に走査する
  6. if (this.rightNode != null ) {
  7. this.rightNode.lastTraverse();
  8. } // 親ノードを出力する
  9. System.out.println (これ) ;
  10. } public TreeNode lastSearch(String num) { // 左のサブツリーを再帰的に走査して検索する
  11. ツリーノード findNode = null ;
  12. if (this.leftNode != null ) {
  13. findNode = this.leftNode.lastSearch(num);
  14. } の場合 (findNode != null ) {
  15. findNodeを返します
  16. } // 右のサブツリーを再帰的に走査して検索する
  17. if (this.rightNode != null ) {
  18. findNode = this.rightNode.lastSearch(num);
  19. } の場合 (findNode != null ) {
  20. findNodeを返します
  21. } // 現在のノードを比較する
  22. if (this.num.equals(num)) {
  23. これを返します
  24. }戻る ヌル;
  25. }

3. ノードを削除する

現在削除中のノードがリーフ ノードである場合は、ノードを直接削除できます。削除中のノードが非リーフ ノードである場合は、ノード ツリーが削除されます。

  1. パブリックvoid deleteNode(文字列 num) {
  2. // 左のノードが削除されているかどうかを判定する
  3. this.leftNode != null && this.leftNode.num.equals(num) の場合 {
  4. this.leftNode = null ;
  5. 戻る;
  6. } // 正しいノードが削除されているかどうかを判定する
  7. this.rightNode != null && this.rightNode.num.equals(num) の場合 {
  8. this.rightNode = null ;
  9. 戻る;
  10. } // 左のサブツリーを走査し、再帰的に削除する
  11. if (this.leftNode != null ) {
  12. this.leftNode.deleteNode(num);
  13. } // 右のサブツリーを走査し、再帰的に削除する
  14. if (this.rightNode != null ) {
  15. 右ノードからノード番号を削除します。
  16. }}

4. 多分岐ツリー

多分岐ツリーとは、親ノードが複数の子ノードを持つことができるが、子ノードは依然として親ノードの法則に従うことを意味します。通常、バイナリツリーの実用性は非常に高く、多分岐ツリーを使用してデータ関係の説明を簡素化できます。

たとえば、Linux ファイルシステム、組織構造の関係、ロールメニュー権限管理システムなどは、通常、マルチブランチツリーに基づいて記述されます。

<<:  人工知能XiaoIceが繊維企業向けにオンデマンドカスタマイズを実現するAIデザインプラットフォームを開設

>>:  従来の連合学習が異種混在の課題に直面したときは、これらのパーソナライズされた連合学習アルゴリズムを試してみてください。

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

人工知能が物理学に及ぼす影響

人工知能(AI)は物理学の分野を含む多くの産業に変革をもたらしています。物理学では、AI は複雑な問...

...

人工知能、自動化、新興技術のトレンドが4.6兆ドルの通貨市場に混乱をもたらしている

いくつかのスタートアップ企業は、最新のテクノロジーを活用して、最大かつ最も古いセクターの 1 つであ...

...

分散トレーニング入門: PyTorch を使用してマルチ GPU 分散トレーニングを実装する方法

具体的には、この記事ではまず、分散コンピューティングの基本概念と、分散コンピューティングがディープラ...

AIに「子犬」を認識させますか? Facebookは変化を感知できるAIを構築

[[389144]]今まで見たことのない犬種や色であっても、私たちは一目見てその犬を認識することがで...

OpenAIの競合InflectAIがマイクロソフトとビル・ゲイツの支援を受けて13億ドルを調達

OpenAIの競合企業Inflection AIは最近、Microsoft、リード・ホフマン、ビル・...

ドローンレースが人間のトッププレイヤーを上回り、強化学習が再びネイチャーの表紙を飾る

最近、自律型ドローンがドローン競技会で人間のトッププレイヤーに勝利しました。この自律型ドローンは、チ...

[ビッグガイがやってくるエピソード8] 電子商取引リスク管理ツール - モバイルデバイス向けの信頼できるID

[51CTO.com からのオリジナル記事] ライブショー「ビッグネームがやってくる」の今回のエピ...

2018 年最も注目された AI および機械学習のスタートアップ 10 社

PwCとCB Insightsによるマネーツリーのレポートによると、人工知能のスタートアップへの投資...

普遍近似定理を理解しなければ、ニューラルネットワークを理解することはできない

ニューラルネットワークの威力を示す証拠文字通り、普遍近似定理はニューラル ネットワークがどのように機...

人工知能の継続的な発展により、ロボットが人間に取って代わり、あらゆる労働を行うようになるのでしょうか?

[[385749]]写真はロボット最近、メディアの報道によると、人類の生存を脅かすと言われる米国の...

人工知能は祝福か、それとも呪いなのか?事故は急増しており、アップルとグーグルも例外ではない

人工知能は現代の大きな発展のトレンドであり、世界中のほぼすべてのハイテク企業が AI 分野の技術を研...