C ++二进制搜索树比较节点数据并删除重复项

时间:2014-04-01 22:23:13

标签: c++ tree text-files duplicate-removal

我用c ++创建了一个二叉搜索树,并用两种类型的数据,字符串和整数加载它。我正在阅读一个文本文件并按字母顺序将树加载我正在拉的单词,以及找到该单词的行号。我能够打印单词和数字就好了。我现在要做的是检查一个单词是否已被打印,如果有,那么我只打印出找到该单词的行号。我正在考虑这样做的方法是在遍历和打印树时比较以前的数据。这是我的打印功能。

void inOrderPrint(Node *rootPtr ) {
    if ( rootPtr != NULL ) {
        for (int i =0; rootPtr->data[i]; i++){
            while(ispunct(rootPtr->data[i]))
                rootPtr->data.erase(i,1);
                }
        rootPtr->data = rootPtr->data.substr(0,10);
        inOrderPrint( rootPtr->left );
        cout << (rootPtr->data)<<rootPtr->lineNum <<endl;
        inOrderPrint( rootPtr->right );
    }
}

这就是我的想法:

if (rootPtr->data == previous rootPtr->data)
    cout<<setw(10)<<theCurrentNode lineNum;
else
    do normal printing

我认为如果这个函数在第一个节点上运行并且将它与不存在的前一个节点进行比较,它会自动尝试将它与NULL进行比较,if语句将返回false并且它将继续运行到其他

有关如何使用实际c ++语法执行此操作的任何建议?或者有人在我的逻辑中看到了一个缺陷吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

此答案将介绍如何使程序打印唯一条目以及文件中第一次出现的行号。如果出现重复,则仅打印每个重复出现的第一个出现的行号。方法是确保树中没有重复的节点并计算冗余事件。

为此,我们可能会修改节点结构,如下所示:

struct Node{
    string data;
    int lineNum;
    int count =1;
    Node* left;
    Node* right;
};

可以编辑Insert函数来计算重复项,如下所示:

Node* Insert(Node* rootPtr,string data,int lineNum){
if(rootPtr == NULL){
    rootPtr = GetNewNode(data,lineNum);
    for (int i =0; rootPtr->data[i]; i++){
        while(ispunct(rootPtr->data[i]))
            rootPtr->data.erase(i,1);
            }
    rootPtr->data = rootPtr->data.substr(0,10);

    return rootPtr;
}
else if(data< rootPtr->data){
    rootPtr->left = Insert(rootPtr->left,data,lineNum);
    for (int i =0; rootPtr->data[i]; i++){
        while(ispunct(rootPtr->data[i]))
            rootPtr->data.erase(i,1);
            }
    rootPtr->data = rootPtr->data.substr(0,10);
}
else if(data > rootPtr->data) {
    rootPtr->right = Insert(rootPtr->right,data,lineNum);
    for (int i =0; rootPtr->data[i]; i++){
        while(ispunct(rootPtr->data[i]))
            rootPtr->data.erase(i,1);
            }
    rootPtr->data = rootPtr->data.substr(0,10);

}
else if(data == rootPtr->data)
    ++rootPtr->count;

return rootPtr;
}

最后可以修改打印功能:

void inOrderPrint(Node *rootPtr ) {
//ofstream outputFile;
//outputFile.open("Output.txt");

if ( rootPtr != NULL ) {
    inOrderPrint( rootPtr->left );
    cout << (rootPtr->data)<<" " << rootPtr->lineNum <<endl;
    int j =rootPtr->count;
    while( --j )
    cout << rootPtr->lineNum <<endl;

    //outputFile << (rootPtr->data)<<rootPtr->lineNum <<endl;
    inOrderPrint( rootPtr->right );
}
}

现在这应该更接近你想要的了。将文本处理与节点处理分开也是一个好主意。 (这个答案假定你会处理它。)否则,如果预处理的文本与处理过的文本不匹配,将创建重复的节点。

祝你好运!