C++ 如何在找到键时增加值?英国理工学院

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

我能够从一个文本文件中检索所有单词并将它们放在一个树中,但每当我在树中找到数据时,我就不能将出现次数增加1。 每个单词现在显示一次,但如果出现1,则不会递增

这是我的类节点

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 * &current, 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;
}