JavaScriptの実装ツリー構造()
まず、ツリー構造の紹介
1.1。ツリー構造を理解することは簡単な
木は何ですか?
本当の木:
木の特徴:
- 一般的に、ツリー持つルートは、ルートが接続されているトランク。
- トランクの分岐部は、多くの形成、発生した枝は、枝が小さいに分化していきます支店。
- 最後のブランチがあり、葉。
実際の生活の中で構造の多くは、回転にツリー構造の対応をシミュレート抽象的なツリー、ある180°
木の。
配列/リスト/ハッシュテーブルのツリー構造とは対照的に、それはどのような利点があります:
アレイ:
- 利点:できるインデックス値にアクセスし、高効率。
- 短所:データときにデータを見つける必要があり、ソートが、生成規則配列を検索効率を向上させるために、挿入および要素を除去する場合には、大量の必要動作の変位は、
リスト:
- 利点:データの挿入や削除は、高効率です。
- 短所:検索あなたが対象データを見つけるまで、見つけるためにゼロからスタートする必要性が低い効率を、あなたはリストの途中でデータを挿入または削除する必要がある場合、効率の挿入や削除は高くありません。
ハッシュテーブル:
- 長所:ハッシュテーブルの挿入/クエリ/削除効率が非常に高いです。
- 欠点は:空間使用率が高くない、ロット単位で使用されるアレイの底部は利用されないと、ハッシュテーブル要素は順序付けられていない、および要素は、固定された順序でハッシュテーブルを横切ることができない;かつ迅速にハッシュを識別することができませんテーブル最大又は最小これらの特別な値。
ツリー:
長所:ツリー構造は、(必ずしもではないが、より自分の高効率よりも)、そのようなツリーデータ構造として発注され、高い検索効率3つの構造の利点を組み合わせた、だけでなく、その存在の欠点を補うために、スペースの活用すばやく最大値と最小値などを得ることができると、高いです。
全体:各データ構造のために、独自の特定のアプリケーションシナリオを持っています
ツリー:
- ツリー(木):ノードからなるn(nは≥0)有限集合。n = 0の場合、呼ばれる空の木。
以下の特性を有する非空ツリー(N> 0)のいずれかのために:
- 着信番号がある根(ルート)と特定のノードは、Rが表します
- 残りのノードは、M(M> 0)T〜1〜、T〜2の互いに素の有限集合に分割することができる 、〜、...、T〜M〜 各セットと呼ばれる木自体でありますオリジナルの木の部分木(サブツリー)。
用語ツリーが使用されます。
- ノード度(°) :ノードのサブツリーの数のノードBの例は、2です。
- ツリー度:すべてのノードツリーの最大度。、図のような次数2は、ツリーです。
- リーフ(葉):次数0のノード H、I等において上記のように(また、リーフノードと呼ばれます)。
- 親ノード(親):0度は、ノードBは、図DおよびEノードの親であるように、ノードは、親ノードではありません。
- 子ノード(子):Bは、親ノードDである場合、DはBの子ノードです。
- 兄弟(兄弟):同じ親を有する各ノードは、マップBとC、D及びE互いに兄弟ノードとして互いにノードの兄弟です。
- 経路長と経路:経路は、A->経路長Hが3であるように、経路長を含む経路の辺の数が呼び出され、他のノードへの経路ノードを指します。
- ノード(レベル)のレベル:指定されたレイヤ1のルートノード、層の数は、その親ノードが他のノードの一つである1つのレベルを追加します。レベルBとノードCは2です。
- ツリーの深さ(奥行き):ツリー内のすべてのノードの最大レベルは。ツリーの深さは、上述したように、図4のツリーの深さです。
1.2。ツリー構造の表現
- 最も一般的な表現:
示されるように、リストモードと同様の組成のツリー構造は、一つのノードの接続によって構成されています。しかし、各親の子ノードのノード数に応じて、各ノードは、親の参照番号が異なっている必要があります。例えば、ノードAは、子ノードB、C、Dの3基準点を必要とする; Bノードは、2つの参照を必要とする子供の点はEとFノード、Kノードが子ノードので、それが基準を必要としません。
この方法の欠点は、我々はノード参照番号かどうかを判断することができないということです。
- 息子-兄表記:
この表現は、以下のような各ノードの完全なデータ・レコードとすることができます。
//节点A
Node{
//存储数据
this.data = data
//统一只记录左边的子节点
this.leftChild = B
//统一只记录右边的第一个兄弟节点
this.rightSibling = null
}
//节点B
Node{
this.data = data
this.leftChild = E
this.rightSibling = C
}
//节点F
Node{
this.data = data
this.leftChild = null
this.rightSibling = null
}
これは、この方法の利点は、各参照内のノードの数が決定されることであることを示します。
- 回転表現兄弟 - 息子
以下は、息子である - 木構造の兄弟表現からなります:
後の45°の時計回りの回転、:
これはなるだろうバイナリツリーので、我々は結論付けることができます:任意のツリーはバイナリツリーによってモデル化することができます。しかし、この親ノードは変更されませんか?実際には、それは子ノードへの利便性だけでポイントの親ノードを設定し、親のためのコードがある限り、対応するノードを検索する権利など、問題ではありません。
第二に、バイナリツリー
バイナリツリーに2.1はじめ
バイナリツリーの概念:高々により、ツリー内の各ノードであれば2つのつの子ノードツリーが呼び出されるように、バイナリツリー。
バイナリツリーは、ほとんどすべての木のがバイナリツリー形式として表現することができないという理由だけで、簡単なのが、またあるため、非常に重要です。
バイナリ構成:
- バイナリツリーが空になることがあり、それがどのノードではありません。
- 二分木が空でない場合は、ルートノードとその左サブツリー2つの互いに素バイナリTR TL及び組成物の右の部分木と呼ばれます。
ファイブバイナリ形式:
上の図は、それぞれ:空のバイナリツリー、バイナリツリーは、唯一つのノードだけ左サブツリーバイナリツリーTL、TR、だけ右サブツリーバイナリを有し、2つのバイナリサブツリーについて存在します。
バイナリツリーの特性:
- 最大二進ノードツリー層iが2 ^(I-1)^、I> = 1。
- 深さkのバイナリツリーのノードの最大数は、2 ^ K ^ - 1、K> = 1。
- 空でないバイナリツリー、N〜0〜非リーフの数は、両方の関係を満たす、2ノードとリーフノードの数を表し、nは約2〜表現:N〜0〜= N〜2〜+ 1 ;以下のように:;次数2、及び4の合計、B、C、F、非リーフノードは、H、E、I、J、Gはリーフノードであり、総数は5である満たすN〜0〜N = 〜2〜+ 1つの法則。
2.2。特別なバイナリツリー
パーフェクトバイナリツリー
パーフェクトバイナリツリー(パーフェクトバイナリツリーは)完璧なバイナリツリーを構成する完全なバイナリツリー(完全なバイナリツリー)、バイナリツリーで、次の層のリーフノードに加えて、各ノードは2つのつの子ノードを持っている、となっています。
完全なバイナリツリー
完全なバイナリツリー(完全2分木):
- バイナリ最後の層に加えて、他の層は、ノードの最大数に達しています。
- そして、リーフノードの最後の層は、左から右へ連続的に存在している、欠失だけ右の葉ノードの数。
- パーフェクトバイナリツリーは特別な完全2分木です。
図では、右の子ノードHの削除以来、それは完全なバイナリツリーではありませんので。
2.3。バイナリデータストレージ
バイナリツリー格納するための一般的な方法の配列と連結リストを:
配列を使用します:
- 完全なバイナリツリー:上から下へ、データを格納するための正しい方法を左。
ノード | A | B | C | D | E | F | G | H |
---|---|---|---|---|---|---|---|---|
いいえ。 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
データは非常に簡単に取ることもあるメモリアレイ、使用している場合:親ノード番号の左の子ノードの数は2 *に等しいが、右の子ノードの数は、親ノードの数* 2 + 1に等しいです。
- 非完全なバイナリツリー:非完全なバイナリツリーの完全なバイナリツリーは上記に従って格納されたプログラムに変換することができ、これは、ストレージスペースの多くを無駄にします。
ノード | A | B | C | ^ | ^ | F | ^ | ^ | ^ | ^ | ^ | ^ | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
いいえ。 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
リストを使用します
バイナリツリーを格納するための最も一般的な方法であるリンクリスト:ノード内にカプセル化された各ノードは、ノードは基準ノードが左右の基準ノードの格納されたデータを含みます。
第三に、バイナリ検索ツリー
3.1二分探索木を認識
二分探索木(BSTとしても知られ、バイナリ検索ツリー)、バイナリ・ソートツリーと二分探索木。
バイナリ検索ツリーはバイナリツリーが空でもよいです。
空でない場合は、次のプロパティ:
- 条件1:空ではない左のサブツリーすべてのキー未満ルートノード鍵。すべての空でないのような3つのノード6は6よりも小さいキーのサブツリーを残し。
- 条件2:空でない右サブツリーのすべてのキーよりも大きく、そのルートキー、キー6のすべての空でない右の部分木のような3つのノードが6よりも大きいです。
- 条件3:左右のサブツリー自体も二分探索木です。
3本の木、上に示され、それはバイナリ条件ではないので、2つのツリーは二分木属する三つの条件を満たすように3を満たしません。
概要:二分探索木は、主である特徴小さい値が常にに格納されて左ノード、比較的大きな値は常にに保たれている右側のノードに。この機能は、バイナリ検索ツリークエリ効率を行い、バイナリ検索ツリーソース「検索」である、非常に高いです。
3.2。応用例のバイナリ検索ツリー
以下は、二分探索木であります:
あなたが唯一の4倍を見つけるために、10れているデータを検索する場合、検索効率が非常に高いです。
- 第1回:10> 9 10は、ルートノード9とを比較するので、次のステップ10は、ルート13 9の右の子と比較されます。
- 第二:左の子ノード<13、10が10、比較器11の次の親ノード13となるよう。
- 第三:10 <11は、次のステップ10左の子ノードとコンパレータ11の親ノード10。
- 第4回:10 = 10、10ので、最終的にデータを見つけます。
同じことが15のデータ、ソートされた配列10でのクエリデータ、クエリ10倍に必要です。
実際には:配列をソートする場合は、2つのポイントを見つけることができます:最初のFind 9、13秒見て、15を見つけるために三度目.... 私たちは、データごとに2分木で表現する言葉を思い付くする場合があることがわかった二分探索木。これが理由高効率を見つけるための二分法の配列です。