我有一个任务,要编写一个索引构建器应用程序,该应用程序使用由行组成的文本并打印文本单词的列表,并在其旁边打印出现的行。
但是当我尝试处理单词已经存在的情况时,我遇到了一个问题,它总是向向量添加一个多余的数字
有人可以帮我吗?
这是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;
}
答案 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
和返回都没有意义,因此我保留了返回值并删除了引用。
您也可以相反。