如何使用二进制搜索树使用索引生成器解决此问题?

时间:2019-04-27 14:20:23

标签: c++ binary-search-tree

我有一个任务,要编写一个索引构建器应用程序,该应用程序使用由行组成的文本并打印文本单词的列表,并在其旁边打印出现的行。

但是当我尝试处理单词已经存在的情况时,我遇到了一个问题,它总是向向量添加一个多余的数字

有人可以帮我吗?

这是BSTnode的定义:

class BSTnode
{
public:
    string data;
    vector<int> linesAppear;
    BSTnode* left;
    BSTnode* right;
    BSTnode()
    {
        left = right = NULL;
    }
};

这是BSTFCI的定义:

class BSTFCI
{
public:
    BSTnode* root;
    BSTFCI()
    {
        root = NULL;
    }
    void add(string ToBST,int lineAppear);
    BSTnode* Insert(BSTnode*& node,string ToBST,int lineAppear);
    BSTnode* create_new_node(string ToBST,int lineAppear);   
};

插入功能

BSTnode* BSTFCI::create_new_node(string ToBST,int lineAppear)
{
    BSTnode* Temp = new BSTnode();
    Temp->data = ToBST;
    Temp->left = Temp->right = NULL;
    Temp->linesAppear.push_back(lineAppear);
    return Temp;
}
BSTnode* BSTFCI::Insert(BSTnode*& node,string ToBST,int lineAppear)
{
    if(node == NULL)
    {
        node = create_new_node(ToBST,lineAppear);
    }
    if(ToBST > node->data)
    {
        node->right = Insert(node->right,ToBST,lineAppear);
    }
    if(ToBST < node->data)
    {
        node->left = Insert(node->left,ToBST,lineAppear);
    }
    //cout <<"inside insert"<< ToBST << endl;
    if(node->data == ToBST)
    {
        node->linesAppear.push_back(lineAppear);
     //   cout <<"inside insert condition "<< node->data << endl;
    }
    return node;

}
void BSTFCI::add(string ToBST,int lineAppear)
{
    root = Insert(root,ToBST,lineAppear);
}

主要功能:

int main()
{
    BSTFCI o;
    string input,ToBST;
    int lineAppear = 0;
    while(getline(cin,input))
    {
        if(input == "done")
        {
            break;
        }
        lineAppear++;
        istringstream convert(input);
        while(convert >> ToBST)
        {
            o.add(ToBST,lineAppear);
        }
    }
    o.print_inOrder(o.root);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是因为您同时在create_new_node(实际上应该是BSTnode中的构造函数)中加上了数字,并在以后if(node->data == ToBST)时加上了。

您需要确定是在创建节点时还是在添加节点后添加它,但是在创建时进行操作才最有意义–为什么您要添加一个节点而不使其出现呢?

我会这样:

class BSTnode
{
public:
    string data;
    vector<int> linesAppear;
    BSTnode* left;
    BSTnode* right;
    BSTnode() : left(nullptr), right(nullptr) {}
    BSTnode(const std::string& word, int appearance) 
        : data(word),
          linesAppear(1, appearance),
          left(nullptr),
          right(nullptr)
    {
    }
};


BSTnode* BSTFCI::Insert(BSTnode* node, string ToBST,int lineAppear)
{
    if(node == nullptr)
    {
        return new BSTnode(ToBST, lineAppear);
    }
    if(ToBST > node->data)
    {
        node->right = Insert(node->right, ToBST, lineAppear);
    }
    else if(ToBST < node->data)
    {
        node->left = Insert(node->left, ToBST, lineAppear);
    }
    else
    {
        node->linesAppear.push_back(lineAppear);
    }
    return node;
}

请注意,引用{em>传递node和返回都没有意义,因此我保留了返回值并删除了引用。
您也可以相反。