我正在尝试为第一个“字典”编写代码。第一个单词将是根,其他单词将按字母顺序添加,因此,如果我使用有序遍历打印树,则这些单词将按字母顺序打印出来。替换功能应该用另一个单词替换一个单词(如果存在)。当我尝试使用删除功能但出现分段错误或重复输出时。我的删除功能出了什么问题?
#include <iostream>
using namespace std;
class lexicon {
private:
struct node{
int key;
string word;
node* left;
node* right;
int counter;
node(const string &w):word(w),left(nullptr),right(nullptr),counter(1){}
}* root;
public:
lexicon(){
root = nullptr;
};
void insert(const string &s){
root= insert(root,s);
};
//returns how many times a word is shown in the dictionary
int lookup(const string &s) const{
node *l=search(root,s);
if(l==nullptr) return 0;
return l->counter;
};
static node* Minword(node* root){
if(root==nullptr) return nullptr;
while(root->right!=nullptr) root=root->right;
return root;
}
static node* deletenode(node* thesi){
if(thesi->right==nullptr && thesi->left==nullptr){
delete(thesi);
return nullptr;
}
if(thesi->left==nullptr){
node* temp=thesi->right;
return temp;
}
else if(thesi->right==nullptr){
node* temp=thesi->left;
//free(thesi);
return temp;
}
else{
node* temp=Minword(thesi->left);
thesi->word=temp->word;
thesi->counter=temp->counter;
thesi->left=deletenode(thesi->left);
}
return thesi;
}
void replace(const string &s1, const string &s2){
int sh=lookup(s1);
if(sh!=0){ //if it is shown then it exists
node* t1=search(root,s1);
node* t=search(root,s2);
deletenode(t1);
if(t==nullptr){
insert(root,s2);
node* temp=search(root,s2);
temp->counter=sh;
}
else{
t->counter=t->counter+sh;
}
}
}
static node* insert(node* r ,const string &v){
if(r==nullptr){
return new node(v);
}
if(r->word==v) (r->counter)++;
else if(r->word>v){
r->left= insert(r->left,v);
}
else{
r->right= insert(r->right,v);
}
return r;
}
static node * search(node *r, const string &v){
if(r==nullptr) return NULL;
if(r->word==v) return r;
else if(r->word>v){
return search(r->left,v);
}
else return search(r->right,v);
}
}
我用以下方法进行测试:
int main(){
lexicon l;
l.insert("the");
l.insert("boy");
l.insert("and");
l.insert("the");
l.insert("wolf");
l.replace("boy","dummy");
l.replace("wolf","dummy");
l.replace("the","dummy");
cout<<l;
}
我得到了一个分割错误。当我仅执行l.replace(“ boy”,“ dummy”)时,我得到:
and 1
boy 1
dummy 1
the 2
wolf 1
但预期输出为:
and 1
dummy 1
the 2
wolf 1