C++ 如何替换二叉搜索树中的节点
我有一个带字符串的二叉搜索树。每个节点都包含字符串和字符串的频率 我的函数有两个字符串,s1,s2。我必须用s2替换s1。 如果bstree中已经存在s2,我只需要添加s1的频率。如果不存在s2,我将创建一个频率为s1的新节点 我所做的是: 1我从bstree中删除s1并保存s1的频率 2我使用s1的频率将s2插入BStree 问题是,当1工作时,s1的节点被删除 第二部分没有给我任何东西当我运行它时没有删除功能,它给了我一些奇怪的符号C++ 如何替换二叉搜索树中的节点,c++,binary-search-tree,C++,Binary Search Tree,我有一个带字符串的二叉搜索树。每个节点都包含字符串和字符串的频率 我的函数有两个字符串,s1,s2。我必须用s2替换s1。 如果bstree中已经存在s2,我只需要添加s1的频率。如果不存在s2,我将创建一个频率为s1的新节点 我所做的是: 1我从bstree中删除s1并保存s1的频率 2我使用s1的频率将s2插入BStree 问题是,当1工作时,s1的节点被删除 第二部分没有给我任何东西当我运行它时没有删除功能,它给了我一些奇怪的符号 struct node{ string data;
struct node{
string data;
int freq;
node *left, *right;
node(string d, int f){
data = d;
freq = f;
left = right = nullptr;
}
node *replacehelp(node *r, string v, int f){
if(r == nullptr)
return new node(v,f);
int state = v.compare(r->data);//to check the alphabetical order
if(state == 0){
r->freq += f;
return r;
}
if(state > 0)
r->right = replacehelp(r->right, v, f);
else if(state < 0)
r->left = replacehelp(r->left, v, f);
}
void replace(const string &s1, const string &s2){
//the delete function works(I get the freq of s1)
root = DeleteNode(root, s1, &freq);
//I have to insert s2 to the tree
root = replacehelp(root,s2,freq);
}
您的问题是因为replacehelp中缺少返回 请注意,测试状态<0在replacehelp中是无用的,因为它既不是0也不是正的,所以
node *replacehelp(node *r, string v, int f){
if(r == nullptr)
return new node(v,f);
int state = v.compare(r->data);//to check the alphabetical order
if(state == 0)
r->freq += f;
else if(state > 0) // 'else' ADDED
r->right = replacehelp(r->right, v, f);
else // MODIFIED
r->left = replacehelp(r->left, v, f);
return r;
}
如果没有给出DeleteNode的定义,那么就不可能知道它是否如您所设想的那样正确
如果我添加一些要运行的定义:
#include <iostream>
#include <string>
using namespace std;
struct node{
string data;
int freq;
node *left, *right;
node(string d, int f){
data = d;
freq = f;
left = right = nullptr;
}
};
node *replacehelp(node *r, string v, int f){
if(r == nullptr)
return new node(v,f);
int state = v.compare(r->data);//to check the alphabetical order
if(state == 0)
r->freq += f;
else if(state > 0) // 'else' ADDED
r->right = replacehelp(r->right, v, f);
else // MODIFIED
r->left = replacehelp(r->left, v, f);
return r; // ADDED
}
// ADDED
node * DeleteNode(node *r, string s, int * freq) // can be "int & freq" to not have to give the addr in the call
{
if (r != nullptr) {
int state = s.compare(r->data);
if (state > 0)
r->right = DeleteNode(r->right, s, freq);
else if (state < 0)
r->left = DeleteNode(r->left, s, freq);
else {
*freq = r->freq;
if (r->right == nullptr) {
node * t = r->left;
delete (r);
return t;
}
if (r->left == nullptr) {
node * t = r->right;
delete (r);
return t;
}
node * t = r->right;
while ((t != nullptr) && (t->left != nullptr))
t = t->left;
r->data = t->data;
r->freq = t->freq;
int dummy;
r->right = DeleteNode(r->right, t->data, &dummy);
}
}
return r;
}
node * root; // ADDED
void replace(const string &s1, const string &s2){
int freq = 0; // initialized to 0 to not have undefined value if DeleteNode do not find the node
//the delete function works(I get the freq of s1)
root = DeleteNode(root, s1, &freq);
//I have to insert s2 to the tree
root = replacehelp(root,s2,freq);
}
// ADDED
void insert(string s, int freq)
{
root = replacehelp(root, s, freq);
}
// ADDED
void pr(node *r)
{
cout << '(';
if (r != nullptr) {
pr(r->left);
cout << '"' << r->data << "\" " << r->freq;
pr(r->right);
}
cout << ')';
}
// ADDED
int main(void)
{
insert("5", 5);
insert("4", 4);
insert("3", 3);
insert("6", 6);
pr(root);
cout << endl;
replace("5", "55");
pr(root);
cout << endl;
replace("3", "33");
pr(root);
cout << endl;
replace("4", "33");
pr(root);
cout << endl;
}
请添加一个包含所有必需代码、输入、预期和实际输出的。并非所有replacehelp路径都返回一个值。您的编译器应该对此发出警告。我不确定您对replacehelp路径的定义。我没有收到任何警告,我使用代码块。我将检查最小可重复性示例是什么,并尝试添加oneNo冒犯,但我尝试将我的问题和代码尽可能简短,保留我认为ppl理解所必需的内容。我做错了什么?每次我在这里发帖我都会被否决。。。每次我试图更准确地回答我的问题,我想我终于又一次设法提出了一个恰当的问题,似乎我做错了。有什么问题吗?如果比较返回任何非零值,则replacehelp函数不会返回任何值。
pi@raspberrypi:/tmp $ g++ -g -pedantic -Wextra -Werror t.cc
pi@raspberrypi:/tmp $ ./a.out
(((()"3" 3())"4" 4())"5" 5(()"6" 6()))
(((()"3" 3())"4" 4(()"55" 5()))"6" 6())
(((()"33" 3())"4" 4(()"55" 5()))"6" 6())
(((()"33" 7())"55" 5())"6" 6())
pi@raspberrypi:/tmp $