簡體   English   中英

C ++二進制搜索樹比較節點數據並刪除重復項

[英]C++ Binary search tree compare data of nodes and remove duplicates

我用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,然后移至else。

關於如何使用實際的c ++語法執行此操作的任何建議? 還是有人看到我的邏輯有缺陷?

提前致謝!

該答案將描述如何使程序打印唯一的條目以及文件中第一次出現的行號。 如果有重復出現,則將僅為每個重復出現打印第一個出現的行號。 該方法是確保樹中沒有重復的節點,並計算重復出現的次數。

為此,我們可以如下修改節點結構:

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

可以對插入函數進行編輯,以計算重復次數,如下所示:

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 );
}
}

現在,這應該更接近您想要的。 將文本處理與節點處理分開也是一個好主意。 (這種回答方式假設您將進行處理。)否則,如果預處理后的文本與處理后的文本不匹配,則會創建重復的節點。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM