210916. Tree


勉強時間:19:30から22:00まで
今日の勉強
[データ構造/アルゴリズム]データ構造基礎:Tree

💡 Tree


💜 ツリーコンセプト

  • のデータ上下関係(=階層関係)を格納データ構造
  • 一方向図の構造で、1本の枝から周囲に伸びる形状は木に似ており、木構造
  • と呼ばれている.
  • コンピュータフォルダ構造等は、ツリー構造の例では
  • である.
  • のデータは、順次リストする線形構造ではなく、1つのデータの背後に複数のデータが存在する可能性があるため、非線形構造の場合、
  • である.
  • 階層、下へ延びる、無周期
  • は複数の頂点で構成され、ツリーは、通常、この参照を矢印で示すサブ関係を持つ頂点への参照を有する.
  • 上-下関係に分割すると、上の対応する頂点を親ノード、下の対応する頂点を子ノードとして表すか、上-下関係を親-子関係として表すことができる.
  • ツリー構造では、最上位の頂点はツリーのルートに対してルートノード
  • と呼ばれる.

    💜 Tree用語集


    🤍 ルーティングノード

  • ツリーの先頭ノード、すなわちルートとなるノード
  • が一般木を表す場合、頂部にある
  • 🤍 親ノード

  • 特定ノードの直接親ノード
  • 🤍 サブノード

  • 特定のノードの直属のサブノード;親ノードとは逆の概念
  • 🤍 兄弟ノード

  • 等親ノード
  • 🤍 Leafノード


    最下位ノード、
  • サブノードなし
  • ツリーの末尾は「Rootノード」ではなく「Leafノード」と表示されます.

    🤍 深浅

  • 特定ノード距離Rootノード
  • 🤍 すいじゅんけい

  • 深さ+1
  • の深さとほぼ同じ概念で、特定の深さのノードを表す用語
  • が用いられる.

    🤍 高さ

  • ツリーの最も深いノードの深さ
  • 🤍 部分木

  • 現在は木の一部で、小さい木
  • は、1つの完全なツリーにも複数の部分ツリーがあり、
  • である.

    💜 じゅようりつ


    ツリー構造により、
  • データ間の階層関係をコンピュータに表示できます.
  • ツリー構造は、
  • のソートおよび圧縮、
  • などのコンピュータ科学における様々な問題を解決するのに役立つ.
  • は、ディレクトリ、優先キュー、スイートなどの様々な抽象データ型を実装するために使用することができる

    💜 Tree巡回

  • データ構造に格納1つまたは複数のデータ、すなわち
  • .
  • ツリーを巡る場合、主に再帰
  • を用いる.
  • ツリー巡りの3つの基本アクション
  • 再帰左部分木巡回
  • 右側部分ツリー
  • を再帰的に巡る
  • 現在のノードのデータ
  • を出力する.

    🤍 pre-order

  • は、2つの部分ツリーを循環する前にノードデータを出力する循環方法
  • である.
  • ツリー巡りの3つの基本動作を以下に示します
  • 現在のノードのデータ
  • を出力する.
  • 再帰左部分木巡回
  • 右側部分ツリー
  • を再帰的に巡る

    🤍 post-order

  • は、2つの部分ツリーを循環する後にノードデータを出力する循環方法
  • である.
  • ツリー巡りの3つの基本動作を以下に示します
  • 再帰左部分木巡回
  • 右側部分ツリー
  • を再帰的に巡る
  • 現在のノードのデータ
  • を出力する.

    🤍 in-order


    出力
  • のデータの動作を2つの部分ツリー間に挟むループ方法
  • .
  • ツリー巡りの3つの基本動作を以下に示します
  • 再帰左部分木巡回
  • 現在のノードのデータ
  • を出力する.
  • 右側部分ツリー
  • を再帰的に巡る

    💜 Tree実装

    class Tree {
      // tree 의 constructor 를 구현
      // tree 의 자식 노드들을 children 으로 할당하여 노드의 자식 노드들을 담을 수 있게 설정
      constructor(value) {
        this.value = value;
        this.children = [];
      }
      // tree 의 자식 노드를 생성 한 후에, 노드의 children 에 push
      insertNode(value) {
        const childNode = new Tree(value);
        this.children.push(childNode);
      }
      // tree 에서 value 값을 탐색
      // 현재 노드의 value 값이 찾는 값과 일치한다면 return
      contains(value) {
        if (this.value === value) {
          return true;
        }
        // 노드가 가진 자식 노드를 순회하는 반복문으로 노드의 children 배열을 탐색
        for (let i = 0; i < this.children.length; i += 1) {
          const childNode = this.children[i];
          if (childNode.contains(value)) {
            return true;
          }
        }
        return false;
      }
    }