二分探索木の要素より少ないすべての要素の数を見つけるための効率的な方法はありますか?C ++でプロシージャまたは実装を見つけようとしましたが、見つかりませんでした。だからあなたが持っていたと言う:
8
/ \
3 10
/ \ \
1 6 14
10未満のノード数を見つけたい場合は、4を取得できます。
二分探索木の要素より少ないすべての要素の数を見つけるための効率的な方法はありますか?C ++でプロシージャまたは実装を見つけようとしましたが、見つかりませんでした。だからあなたが持っていたと言う:
8
/ \
3 10
/ \ \
1 6 14
10未満のノード数を見つけたい場合は、4を取得できます。
特定のノードの下にあるノードの数が(一定時間内に)わかっている場合は、次のようにするだけです。
int BinarySearchTree::countLessThan(const Node *n, const T &value) const {
if (n->value >= value) {
// The value has to be in the left sub-tree, so continue searching there:
if (n->left)
return countLessThan(n->left, value);
else
return 0;
} else {
// The value has to be in the right sub-tree, so continue searching there
// but include the whole left sub-tree and myself:
int count = 1;
if (n->left)
count += n->left->count();
if (n->right)
count += countLessThan(n->right, value);
return count;
}
}
ルートノードでアルゴリズムを開始します。
int BinarySearchTree::countLessThan(const T &value) const {
countLessThan(root, value);
}
ライブの例はここで見ることができます:http://ideone.com/JcpjeK
これは次のツリーで実行されます(14と10を入れ替えたので、10は14の左の子になることができます。これは、私の迅速でダーティなBST実装では、左の子が既に存在する場合にのみ右の子が許可されるためです)。
8
/ \
3 14
/ \ /
1 6 10
あなたはこのようなことをすることができます:
int res = countLessThan(root, value, 0); // res is your answer
次に、これを実装します。
int BTree::countLessThan(node *currNode, int value, int count)
{
if(currNode->left != NULL)
count = countLessThan(currNode->left, value, count);
if(currNode->value >= value)
return count;
count++;
if(currNode->right != NULL)
count = countLessThan(currNode->right, value, count);
return count;
}
std::map
またはstd::set
をBSTとして使用している場合は、std::map::lower_bound
メンバー関数を以下と組み合わせて使用できstd::distance
ます。
auto count = std::distance(bst.begin(), bst.lower_bound(target));
それ以外の場合は、関数を使用できますが、コンテナーがランダムアクセスイテレーターを実装していることを前提としているため、std::lower_bound
フラットコンテナー()でのみ最適になります。std::vector
auto count = std::distance(
bst.begin(), std::lower_bound(bst.begin(), bst.end(), target));