二进制搜索树的C ++删除节点

时间:2019-05-18 08:43:11

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

我用字符串创建了二进制搜索树。 每个节点都包含字符串和字符串的频率。

因此问题给了我两个字符串。我必须将s1替换为s2。如果s2不存在,则创建一个频率为s1的新节点。如果存在s2,则将s1的频率添加到s2的频率中。 在下面的代码中,我跳过了替换部分。我只删除s1并保存其频率。 但这不起作用...它什么都不打印...

struct node{
    string data;
    int freq;
    node *left, *right;
    node(string d, int f){
        data = d;
        freq = f;
        left = right = nullptr;
    }
};
class lexicon {
public:
    lexicon();
    ~lexicon();

    void insert(const string &s);
    int lookup(const string &s);
    int depth(const string &s);
    void replace(const string &s1, const string &s2);

    friend ostream & operator << (ostream &out, const lexicon &l);
private:
    node *root;
    static node *FindMin(node* r){
        if(r == nullptr)
            return nullptr;

        while(r->left != nullptr)
            r = r->left;

        return r;
        }
    static node *DeleteNode(node *r, string v){
        if(r == nullptr)
            return r;

        int state = v.compare(r->data);
        if(state > 0)
            r->right = DeleteNode(r->right, v);
        else if(state < 0)
            r->left = DeleteNode(r->left, v);
        else {
            //No child
            if(r->right == nullptr && r->left == nullptr){
                delete r;
                r = nullptr;
            }
            //One child
            else if(r->right == nullptr){
                node *temp = r;
                r = r->left;
                delete temp;
            }
            else if(r->left == nullptr){
                node *temp = r;
                r = r->right;
                delete temp;
            }
            //Two children
            else{
                node *temp = FindMin(r->right);
                r->data = temp->data;
                r->freq = temp->freq;
                r->right = DeleteNode(r->right,temp->data);
            }
            return r;

        }
    }
};

void lexicon::replace(const string &s1, const string &s2){
    root = DeleteNode(root, s1);
}

0 个答案:

没有答案