C ++二进制搜索树 - 复杂类型

时间:2013-01-04 16:56:16

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

我需要为两种类型的对象实现BST;帐户和客户。这两种类型都有一个pk(都称为“id”)。 当我谷歌/研究解决方案时,我可以找到大量的BST解决方案,但它们似乎都适用于简单类型,例如BST解决方案可以排序整数,如{1,2,3,4,99,... 999} - 但我希望BST解决方案根据他们的pk对复杂的类型/类进行排序。这可能/任何提示?感谢。

2 个答案:

答案 0 :(得分:4)

用于构建整数二叉搜索树的逻辑应该可以立即推广到其他数据类型。而不是将整数作为键存储在每个节点中,而是将您的客户和帐户名称存储在每个字段中,但在进行查找时只比较主键。它真的应该那么简单。

那就是说,除非这是用于家庭作业,你应该使用std :: map,它具有二进制搜索树的所有复杂性保证,但已经为你编写,广泛可用,并经过严格测试。 / p>

希望这有帮助!

答案 1 :(得分:3)

一种方法是修改节点定义,添加对要存储的对象的引用并设置索引(在您的情况下为pk),以对注释进行排序。在使用不同类型时,模板可能会解决:

class Account
{
    public:
        Account(int k) : pk(k) {};
        int pk;
    /* ... */
};


template<typename T>
class TreeNode
{
    public:
        TreeNode(T& the_object) : id(the_object.pk), object(the_object) {};

        int id;
        T& object;
};


int main () {
    Account a(9);
    TreeNode<Account> tn(a);
    std::cout << tn.id;
}

如果要在树中混合不同的对象类型,另一种方法是定义一个包含pk属性访问器的类,并使帐户和客户在其中,例如:

class Indexable
{
    public:
        Indexable(int the_pk) : pk(the_pk) {};
        int pk;
};

class Account : public Indexable
{
    public:
        Account(int k) : Indexable(k) {};
    /* ... */
};

class TreeNode
{
    public:
        TreeNode(Indexable& the_object) : id(the_object.pk), object(the_object) {};

        int id;
        Indexable& object;
};


int main () {
    Account a(9);
    TreeNode tn(a);
    std::cout << tn.id;
}

正如其他答案所指出的那样,在制作中你可能会考虑使用std :: map或其他已知的树结构库。