0

我必须使用二叉搜索树来实现一个行为类似于字符串映射的类。这是我实现的类:

template<class T>
class StringMapper {
private:
    // Pair
    struct Pair {
        std::string el1;
        T el2;
    };

    // Nod
    struct Node {
        Pair* data;
        Node* left;
        Node* right;
        Node()
        {
            data = new Pair;
        }
        ~Node()
        {
            delete data;
        }
        int nod_size()
        {
             // code here
        }
    };
    Node* root;
public:
    StringMapper()
    {
        root = 0;
    }
    ~StringMapper() {}
    void insert(std::string from, const T& to)
    {
        // code here
    }

    bool find(std::string from,const T& to) const
    {
        return find(root, to);
    }

    bool find(Node* node, const T& value) const
    {
        // code here
    }

    bool getFirstPair(std::string& from, T& to)
    {
        if(root != 0)
        {
            from = root->data->el1;
            to = root->data->el2;
            return true;
        }
        return false;
    }
    bool getNextPair(std::string& from, T& to)
    {
        if(root != 0)
        {

        }
        return false;
    }

    int size() const
    {
        return root->nod_size();
    }
};

老实说,我不知道如何实现该功能getNextPair()
如果有人可以帮助我,我将不胜感激。

4

2 回答 2

1

您的接口是一个内部迭代器。您需要保留某种指向您在迭代中所处位置的指针,并将其设置在 getFirstPair() 中。

添加后,getNextPair() 将转到下一个。这样做有点困难,但这是你的任务,所以我把它留给你。

实际std::map使用一个外部迭代器——它将迭代的状态与数据结构分开。主要优点是能够同时进行多个迭代。

于 2011-03-06T21:22:57.970 回答
1

不只是抛出 getNextPair 的算法,您将需要保留某种指向“当前”对的内部迭代器。一旦你知道了,为了计算下一对的算法,你自己画一棵带有一些节点的树,看看在给定树中的任何节点的情况下如何找到树中的下一个节点。

于 2011-03-06T21:46:31.097 回答