JavaScriptでの二分探索木の実装
ツリーデータ構造
ツリーは、いくつかのエッジで接続されたノードのコレクションです。従来、ツリーの各ノードは、その子へのデータと参照を保持しています。
二分探索木
二分探索木は、値の小さいノードが左側に格納され、値の大きいノードが右側に格納される二分木です。
たとえば、有効なBSTの視覚的表現は-
です。25 / \ 20 36 / \ / \ 10 22 30 40
それでは、JavaScript言語で独自のバイナリ検索ツリーを実装しましょう。
ステップ1:ノードクラス
このクラスは、BSTのさまざまなポイントに存在する単一のノードを表します。 BSTは、上記のルールに従って配置されたデータと子参照を格納するノードのコレクションに他なりません。
class Node{ constructor(data) { this.data = data; this.left = null; this.right = null; }; };
新しいノードインスタンスを作成するために、このクラスをいくつかのデータを使用してこのように呼び出すことができます-
const newNode = new Node(23);
これにより、データセットが23で、左右の参照が両方ともnullである新しいノードインスタンスが作成されます。
ステップ2:二分探索木クラス:
class BinarySearchTree{ constructor(){ this.root = null; }; };
これにより、新しいキーワードで呼び出してツリーインスタンスを作成できるバイナリ検索ツリークラスが作成されます。
これで基本的な作業が完了したので、適切な場所に新しいノードを挿入することに移りましょう(定義で説明されているBSTのルールに従います)。
ステップ3:BSTにノードを挿入する
class BinarySearchTree{ constructor(){ this.root = null; } insert(data){ var newNode = new Node(data); if(this.root === null){ this.root = newNode; }else{ this.insertNode(this.root, newNode); }; }; insertNode(node, newNode){ if(newNode.data < node.data){ if(node.left === null){ node.left = newNode; }else{ this.insertNode(node.left, newNode); }; } else { if(node.right === null){ node.right = newNode; }else{ this.insertNode(node.right,newNode); }; }; }; };
例
完全な二分探索木コード:
class Node{ constructor(data) { this.data = data; this.left = null; this.right = null; }; }; class BinarySearchTree{ constructor(){ this.root = null; } insert(data){ var newNode = new Node(data); if(this.root === null){ this.root = newNode; }else{ this.insertNode(this.root, newNode); }; }; insertNode(node, newNode){ if(newNode.data < node.data){ if(node.left === null){ node.left = newNode; }else{ this.insertNode(node.left, newNode); }; } else { if(node.right === null){ node.right = newNode; }else{ this.insertNode(node.right,newNode); }; }; }; }; const BST = new BinarySearchTree(); BST.insert(1); BST.insert(3); BST.insert(2);
-
データ構造の平衡二分探索木
ここでは、平衡二分探索木とは何かを確認します。二分探索木(BST)は二分木であり、左の子では要素が少なく、右の子では要素が大きくなります。 BSTで要素を検索するための平均時間計算量はO(log n)です。二分探索木の高さに依存します。二分探索木の特性を維持するために、木が歪むことがあります。したがって、歪んだ木は次のようになります- これは実際にはツリーですが、リンクリストのように見えます。この種の木の場合、検索時間はO(n)になります。これは二分木には効果的ではありません。 これらの問題を克服するために、高さのバランスが取れたツリーを作成できます。したがって、木は殺されません。
-
データ構造における二分木探索
このセクションでは、バイナリ検索ツリーに存在するキーをトラバースするためのさまざまなトラバーサルアルゴリズムについて説明します。これらのトラバーサルは、インオーダートラバーサル、プレオーダートラバーサル、ポストオーダートラバーサル、およびレベルオーダートラバーサルです。 このようなツリーが1つあるとします- インオーダートラバーサルシーケンスは、-5 8 10 15 16 20 23のようになります。 プレオーダートラバーサルシーケンスは、-10 5 8 16 15 20 23のようになります。 ポストオーダートラバーサルシーケンスは次のようになります− 8 5 15 23 20