在二叉搜索树中提取质量

时间:2013-03-24 02:10:45

标签: c++ binary-tree binary-search-tree

是否有有效的方法可以在二叉搜索树中找到少于元素的所有元素的数量?我一直在尝试用C ++找到一个程序或实现,但我还是没能。所以说你有:

      8
    /   \
   3     10
  / \      \
 1   6      14

并且您想要找到小于10的节点数,您可以获得4。

3 个答案:

答案 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)

  1. 如果您使用std::mapstd::set作为BST,则可以将std::map::lower_bound成员函数与std::distance结合使用:

    auto count = std::distance(bst.begin(), bst.lower_bound(target));
    
  2. 否则,您可以使用std::lower_bound函数,但它只是最适合使用扁平容器(std::vector),因为它假定容器实现随机访问迭代器。

    auto count = std::distance(
        bst.begin(), std::lower_bound(bst.begin(), bst.end(), target));