是否有有效的方法可以在二叉搜索树中找到少于元素的所有元素的数量?我一直在尝试用C ++找到一个程序或实现,但我还是没能。所以说你有:
8
/ \
3 10
/ \ \
1 6 14
并且您想要找到小于10的节点数,您可以获得4。
答案 0 :(得分:3)
如果你知道给定节点下面有多少节点(在恒定时间内),你可以简单地执行以下操作:
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实现只允许一个正确的孩子,如果已经有一个左孩子):< / p>
8
/ \
3 14
/ \ /
1 6 10
答案 1 :(得分:0)
您可以这样做:
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;
}
答案 2 :(得分:-1)
如果您使用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));