我用字符串创建了二进制搜索树。 每个节点都包含字符串和字符串的频率。
因此问题给了我两个字符串。我必须将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);
}