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

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

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デザインプラットフォームを開設

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

ブログ    
ブログ    

推薦する

プログラマーでなくてもわかる「機械学習」の原理

機械学習とは何ですか?一般的なシナリオから始めましょう:ある日、マンゴーを買いに行ったところ、店員が...

テスラのヒューマノイドロボットが再び進化:視覚のみに基づいて物体を自律的に分類し、ヨガができる

数ヶ月沈黙していたテスラのヒューマノイドロボット、オプティマスプライムがついに新たな展開を見せた。私...

人工知能が電力網の未来の鍵となる理由

[[201461]] 2016年の英国の電力構成は過去60年間で最もクリーンとなり、主に風力と太陽光...

5年後に最もホットなものは何でしょうか? 2025 年のトップ 10 トレンド: ゼロ検索時代の到来

[[273076]]ファーウェイは8月8日、世界産業展望GIV@2025を発表し、次のように予測した...

エコシステムの構築と垂直実装により、TerminusはAIoT分野で際立つ存在に

[51CTO.com からのオリジナル記事] モノのインターネットは人工知能なしでは成功しません。モ...

学者は大喜び!MetaがPDFと数式を変換できるOCRツールをリリース

私たちが通常、論文や科学文献を読むときに目にするファイル形式は、基本的に PDF (Portable...

AIと透明性:AIによる意思決定プロセスの重要性

人工知能(AI)は革命的かつ変革的な技術となり、顧客サービスや医療から金融や交通に至るまで、人類存在...

...

AIがフィンテックを変える4つの方法

[[432805]]金融業界の企業は、人工知能 (AI) を使用して複数のソースからのデータを分析お...

2018年中国人工知能都市ランキングトップ15

最近、工業情報化部直属の中国情報通信研究院傘下の研究機関であるCCIDコンサルティングが「中国の人工...

MITの人工知能研究室で1年間働いて学んだ5つのこと

Mike Ferguson は、MIT 脳認知科学部 (MIT BCS) の研究ソフトウェア エンジ...

...

ジャック・マー:テクノロジーは私たちの生活をより健康にしなければ意味がない

9月17日から19日まで、上海で「人工知能が新時代を力づける」をテーマにした2018年世界人工知能大...

...

日本の芥川賞受賞者が認める:小説の5%はChatGPTによって書かれた

1月22日、日本で最も権威のある文学賞である芥川賞を受賞した作家が、受賞作である小説「東京同情塔」の...