JavaScriptで二分探索木(BST)に特定の値が存在するかどうかを判定する方法
本記事では、BinarySearchTree(二分探索木)データ型のプロトタイプに、引数として渡された値がBST内に存在するかどうかを判定するJavaScript関数 contains を実装する方法を解説します。
二分探索木における探索の仕組み
二分探索木では、「左の子孫は親ノードより小さく、右の子孫は親ノードより大きい」という性質が成り立ちます。この性質を利用すると、1回の比較ごとに探索対象を左右どちらかに絞り込めるため、平均計算量 O(log n) で効率的に値を検索できます。
実装例
コードは以下の通りです。
// class for a single Node for BST
class Node {
constructor(value) {
this.value = value;
}
}
// class for BST
// contains function to insert node and search for existing nodes
class BinarySearchTree {
constructor() {
this._root = null;
};
insert(value) {
let node = this, side = '_root';
while (node[side]) {
node = node[side];
if (value === node.value) {
return;
};
side = value < node.value ? 'left' : 'right';
};
node[side] = new Node(value);
};
contains(value) {
let current = this._root;
while (current) {
if (value === current.value) {
return true;
};
current = value < current.value ? current.left : current.right;
}
return false;
};
}
const tree = new BinarySearchTree();
for (let i = 0; i < 10; i++) {
tree.insert(Math.floor(Math.random() * 1000));
};
tree.insert(34);
console.log(tree.contains(34));
console.log(tree.contains(334));コードのポイント
insertメソッド:値の大小関係に従って適切な位置に新しいノードを挿入します。重複した値は挿入されません。containsメソッド:根ノードから順に値を比較し、一致すればtrueを返します。探索対象がなくなればfalseを返します。
出力
コンソールには次のように出力されます。
true false
34 は明示的に挿入しているため true となり、ランダム生成された10個の値に含まれる可能性が低い 334 は false となります。
-
JavaScriptの二分木(バイナリツリー)とは?基本概念と重要用語を徹底解説
二分木(バイナリツリー)は、データの格納を目的として使用される特殊なデータ構造です。最大の特徴は、各ノードが持てる子ノードの数が2つまでという条件にあります。二分木は、整列済み配列と連結リストの両方の長所を兼ね備えた構造です。検索はソートされた配列と同等の速さで行え、データの挿入や削除も連結リストと同様に高速に実行できます。そのため、大量のデータを効率的に扱いたい場合に非常に有用なデータ構造といえます。以下は、二分木の構造を示したイラストです。図には、このあと解説する重要な用語も含まれています。二分木における重要な用語二分木を理解するうえで押さえておきたい、主要な用語を以下にまとめました。パス
-
JavaScriptでハッシュのキーを取得するには?Object.keys()メソッドの使い方
JavaScriptでは、ハッシュは一般的にオブジェクトとして表現されます。オブジェクトが持つすべてのキー(プロパティ名)を取得したい場合、最も簡単で推奨される方法がObject.keys()メソッドです。このメソッドは、指定したオブジェクトの列挙可能なプロパティ名を文字列の配列として返します。 基本構文 Object.keys(オブジェクト名) 戻り値はキー名の配列になるため、そのまま配列操作メソッド(forEachやmapなど)と組み合わせて使えるのも大きな利点です。 サンプルコード 以下は、ボタンをクリックするとハッシュ(オブジェクト)のキーを画面に表示する例です。 <!DOCTY