C++ 如何在找到键时增加值?英国理工学院
我能够从一个文本文件中检索所有单词并将它们放在一个树中,但每当我在树中找到数据时,我就不能将出现次数增加1。 每个单词现在显示一次,但如果出现1,则不会递增 这是我的类节点C++ 如何在找到键时增加值?英国理工学院,c++,tree,insert,binary-search-tree,C++,Tree,Insert,Binary Search Tree,我能够从一个文本文件中检索所有单词并将它们放在一个树中,但每当我在树中找到数据时,我就不能将出现次数增加1。 每个单词现在显示一次,但如果出现1,则不会递增 这是我的类节点 class Node{ private: Node *left; //left child Node *right; //right child std::string num; p
class Node{
private:
Node *left; //left child
Node *right; //right child
std::string num;
public:
int data; //number
Node(); //constructor
void setData(string num, int data); //sets number in node
string getData(); //return numbers from node
int getOcc();
void setLeft(Node *l); //sets left child pointer
Node* getLeft(); //returns left child pointer
void setRight(Node *r); //sets right child pointer
Node* getRight(); //return right child pointer
};
这是我的BST班
class BST{
private:
Node * root; //root node pointer
public:
BST(); //constructor
~BST(); //destructor
void Insert(string num, int data); //Inserts new number in tree
bool find(string num); //finds whether a number is present in tree
void min(); //find and print minimum number in the tree
void max(); //find and print maximum number in the tree
void save_file(string filename); //save the tree to file
void Delete(string num); //deletes a number from tree
void LoadFromFile(string filename); //loads numbers from file to tree
void Print(); //print tree to stdout
//private functions used as helper functions in the public operations
private:
void printHelper(Node *root);
bool findHelper(Node *root,string num);
void InsertHelper(Node* current, Node* newnode);
void findMinHelper(Node* current);
void findMaxHelper(Node * current);
void saveHelper(ofstream &fout, Node* current);
Node* DeleteHelper(Node *current, string num);
Node * findMaximum(Node * n);
void clear(Node *currnt);
};
在我的main中,我使用一个循环将单词一个接一个地插入,循环的发生率为1
树。插入,1;但是最终结果总是显示每个单词,出现率=1。您需要让getOcc返回一个引用,以便更新该值。此时,您正在递增事件的副本
试一试
Node.h
Node.cpp
像这样使用它
int &h = n->getOcc();
++h;
您需要使getOcc返回一个引用,以便更新该值。此时,您正在递增事件的副本
试一试
Node.h
Node.cpp
像这样使用它
int &h = n->getOcc();
++h;
二叉树中已存在具有指定数据的节点时,成员函数Insert存在内存泄漏,因为在此代码段中
else if (find(n->getData()) == true){
int h = n->getOcc();
h++;
n->setData(num, h);
}
它没有被释放。此外,成员函数setData应用于这个新创建的节点,它与二叉树中已经存在的节点没有任何共同之处
函数及其辅助函数InsertHelper可以按以下方式重写
void BST::Insert(string num, int data)
{
InsertHelper( root, num, data ); //call helper to insert
}
及
及
二叉树中已存在具有指定数据的节点时,成员函数Insert存在内存泄漏,因为在此代码段中
else if (find(n->getData()) == true){
int h = n->getOcc();
h++;
n->setData(num, h);
}
它没有被释放。此外,成员函数setData应用于这个新创建的节点,它与二叉树中已经存在的节点没有任何共同之处
函数及其辅助函数InsertHelper可以按以下方式重写
void BST::Insert(string num, int data)
{
InsertHelper( root, num, data ); //call helper to insert
}
及
及
else if findn->getData==true{对我来说似乎是错误的。如果findnum{同样的事情仍然是1,我已经被困在这里两天了:'你试过调试你的find方法吗?我会从那里开始看看到底发生了什么。另一个问题是你总是增加根节点,而不是你真正想要的。希望现在xD On Insert你总是在创建一个新节点。然后你在新节点上增加已创建对象,但不在树中的对象上。因此,您应该重新编写find方法以返回节点*。如果找到该方法,则应返回匹配的节点else nullptr。然后,如果findn->getData==true{对我来说似乎有误,则可以增加发生率else。如果findnum错误,请尝试else{同样的事情仍然是1,我已经被困在这里两天了:'你试过调试你的find方法吗?我会从那里开始看看到底发生了什么。另一个问题是你总是增加根节点,而不是你真正想要的。希望现在xD On Insert你总是在创建一个新节点。然后你在新节点上增加已创建对象,但不在树中的对象上。因此,您应该重新编写find方法以返回节点*。如果找到该方法,则应返回匹配的节点else nullptr。然后,您可以增加发生率。您可能需要阅读以下内容:您可能需要阅读此官方帮助页:正如旁注:您可能需要阅读此内容:您可能需要阅读t他的官方帮助页面:顺便说一句:你做得很好,老板。Thaaankkss我怎样才能像这样提高自己?@KingAzaiez尝试在SO做其他问题中描述的任务是很有用的。弗拉德先生,我真是太感谢你了。我已经被困在这两天了,你甚至没有使用“查找”功能就这么做了。@KingAzaiez Th在这种情况下,e function find没有用,因为它会使函数插入效率低下。我会采纳你的建议,将我在这里找到的问题作为作业来改进。谢谢你,阿洛特·弗拉迪先生,你刚才做得很好,老板。他安克斯我怎样才能像这样改进自己?@KingAzaiez尝试完成其他描述的作业是很有用的r在SO的问题。我真是太感谢你了,弗拉德先生。我已经在这个问题上纠缠了两天,你甚至没有使用“查找”函数就这么做了。@KingAzaiez在这种情况下,“查找”函数没有用,因为它会使函数插入效率低下。我会接受你的建议,将我在这里找到的问题作为作业来改进。谢谢你弗拉德
void BST::Insert(string num, int data)
{
InsertHelper( root, num, data ); //call helper to insert
}
void BST::InsertHelper( Node * ¤t, string num, int data )
{
if ( current == nullptr )
{
// create new node to be inserted
current = new Node();
current->setData( num, data );
current->setLeft( nullptr );
current->setRight( nullptr );
}
else if ( num < current->getData() )
{
InsertHelper( current.getLeft(), num, data );
}
else if ( current->getData() < num )
{
InsertHelper( current.getRight(), num, data );
}
else
{
int h = current->getOcc();
h++;
current->setData(num, h);
}
}
Node * & getLeft();
Node * & Node::getLeft(){
return this->left;
}
Node * & Node::getRight();
Node * & Node::getRight(){
return this->right;
}