C++ C++;删除二叉搜索树的节点
我用字符串创建了二叉搜索树。 每个节点都包含字符串和字符串的频率 所以这个问题给了我两个条件。我必须用C++ C++;删除二叉搜索树的节点,c++,algorithm,binary-search-tree,C++,Algorithm,Binary Search Tree,我用字符串创建了二叉搜索树。 每个节点都包含字符串和字符串的频率 所以这个问题给了我两个条件。我必须用s2替换s1。如果s2不存在,我将创建一个频率为s1的新节点。如果存在s2,我将s1的频率添加到s2的频率中。 在下面的代码中,我跳过了替换部分。我只删除s1并保存其频率。 但它不起作用。。。它没有打印任何东西 struct node{ string data; int freq; node *left, *right; node(string d, int f)
s2
替换s1
。如果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);
}
struct节点{
字符串数据;
国际频率;
节点*左,*右;
节点(字符串d,整数f){
数据=d;
频率=f;
左=右=空PTR;
}
};
课堂词汇{
公众:
词汇();
~lexicon();
无效插入(常量字符串和s);
整数查找(常量字符串&s);
整数深度(常量字符串和s);
无效替换(常量字符串和s1、常量字符串和s2);
friend ostream和操作员左!=nullptr)
r=r->左;
返回r;
}
静态节点*DeleteNode(节点*r,字符串v){
if(r==nullptr)
返回r;
int state=v.compare(r->data);
如果(状态>0)
r->right=DeleteNode(r->right,v);
else if(状态<0)
r->left=DeleteNode(r->left,v);
否则{
//没有孩子
如果(r->right==nullptr&&r->left==nullptr){
删除r;
r=nullptr;
}
//独生子女
else if(r->right==nullptr){
节点*temp=r;
r=r->左;
删除临时文件;
}
否则如果(r->left==nullptr){
节点*temp=r;
r=r->右;
删除临时文件;
}
//两个孩子
否则{
节点*temp=FindMin(r->右侧);
r->data=temp->data;
r->freq=温度->频率;
r->right=DeleteNode(r->right,temp->data);
}
返回r;
}
}
};
void lexicon::replace(常量字符串&s1,常量字符串&s2){
根=删除节点(根,s1);
}
我建议您使用调试器逐行检查代码,这会让您了解代码出了什么问题。我使用的是代码块,但我不知道如何设置和使用调试器。(我在git hub上cs50课程时使用了调试器,但即使我尝试在代码块上使用dubugger,我也不知道如何……“我正在使用代码块,但我不知道如何设置和使用调试器。”容易找到的材料:我想这是我上次尝试使用的视频。我想我应该再试一次。感谢我比WATCHNG视频更容易研究文档。你可能应该考虑使用后一个链接。我建议你检查你的代码逐行使用调试器,这应该给你一个GRA。sp它出了什么问题。我正在使用代码块,但我不知道如何设置和使用调试器。(我在git hub学习cs50课程时使用了调试器,但即使我尝试在代码块上使用dubugger,我也不知道如何…)“我正在使用代码块,但我不知道如何设置和使用调试器。”容易找到的材料:我想这是我上次尝试使用的视频。我想我应该再试一次。感谢我比WATCHNG视频更容易研究文档。你可能应该考虑跟后一个链接。