删除节点并将其替换为BST错误

时间:2019-05-16 16:15:23

标签: c++ binary-search-tree

我正在尝试为第一个“字典”编写代码。第一个单词将是根,其他单词将按字母顺序添加,因此,如果我使用有序遍历打印树,则这些单词将按字母顺序打印出来。替换功能应该用另一个单词替换一个单词(如果存在)。当我尝试使用删除功能但出现分段错误或重复输出时。我的删除功能出了什么问题?

#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

0 个答案:

没有答案