Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

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);

  1. データ構造の平衡二分探索木

    ここでは、平衡二分探索木とは何かを確認します。二分探索木(BST)は二分木であり、左の子では要素が少なく、右の子では要素が大きくなります。 BSTで要素を検索するための平均時間計算量はO(log n)です。二分探索木の高さに依存します。二分探索木の特性を維持するために、木が歪むことがあります。したがって、歪んだ木は次のようになります- これは実際にはツリーですが、リンクリストのように見えます。この種の木の場合、検索時間はO(n)になります。これは二分木には効果的ではありません。 これらの問題を克服するために、高さのバランスが取れたツリーを作成できます。したがって、木は殺されません。

  2. データ構造における二分木探索

    このセクションでは、バイナリ検索ツリーに存在するキーをトラバースするためのさまざまなトラバーサルアルゴリズムについて説明します。これらのトラバーサルは、インオーダートラバーサル、プレオーダートラバーサル、ポストオーダートラバーサル、およびレベルオーダートラバーサルです。 このようなツリーが1つあるとします- インオーダートラバーサルシーケンスは、-5 8 10 15 16 20 23のようになります。 プレオーダートラバーサルシーケンスは、-10 5 8 16 15 20 23のようになります。 ポストオーダートラバーサルシーケンスは次のようになります− 8 5 15 23 20